2017-03-08 5 views
2

からグループ独自のCOL2&COL3値全体で一意COL1の値をスキーマCOL1 = INT、COL2 = STR、などCOL3 = STRでCSVテーブルを変換するために探していると:どのようにCSV

入力サンプル

INT1, S1, S2 
INT1, S1, S3 
INT1, S2, S3 
INT2, S1, S2 
INT2, S1, S3 
INT2, S1, S4 
INT2, S2, S3 
INT2, S2, S4 
INT2, S3, S4 

は、出力CSV /テーブルにCOL2またはCOL3の一意の文字列がCOL1として出力され、その後に出現した一意のCOL1 INTのリスト(出力テーブルのCOL2/CSV)が続きます。

出力CSV /表:

S1, [INT1, INT2] 
S2, [INT1, INT2] 
S3, [INT1, INT2] 
S4, [INT2] 
+0

独特の平均値を何?列が一意であるか、列2と列3に固有の列はありますか? – Denziloe

答えて

3

まず、あなたは縦長の形式にCOL2COL3をスタックにmeltを使用することができます。第二に、あなたは今、溶融した列によってグループにgroupbyを使用し、各サブグループ(S1、S2、など...)のためのCOL1の一意の値を取得することができます:

# create example df 
df = pd.DataFrame([["INT1", "S1", "S5"], 
        ["INT1", "S2", "S3"], 
        ["INT2", "S1", "S2"], 
        ["INT2", "S1", "S3"]], 
        columns=["COL1", "COL2", "COL3"]) 
print(df) 

    COL1 COL2 COL3 
0 INT1 S1  S5 
1 INT1 S2  S3 
2 INT2 S1  S2 
3 INT2 S1  S3 

result = pd.melt(df, id_vars="COL1").groupby("value")["COL1"].unique() 
print(result) 

S1 [INT1, INT2] 
S2 [INT1, INT2] 
S3 [INT1, INT2] 
S5 [INT1] 
1

COL2COL3が等価である場合は、set機能で、長い形式に2つの列を積み重ねる値でグループとINT列のユニークな要素を見つけることができます:

df.set_index(0).stack().rename("s").reset_index().groupby('s')[0].apply(set) 

#s 
# S1 {INT2, INT1} 
# S2 {INT2, INT1} 
# S3 {INT2, INT1} 
# S4   {INT2} 
#Name: 0, dtype: object 
関連する問題