2017-03-08 17 views
2

求變換CSV表架構COL1 = INT,COL2 = STR,COL3 = STR作爲這樣的基團跨越獨特COL2&COL3值唯一COL1值:如何從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列表(在輸出表格/ CSV的COL2中)。

輸出CSV /表:

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

什麼獨特的是什麼意思?第2列和第3列是唯一的還是唯一的? – Denziloe

回答

3

首先,你可以使用melt垂直堆疊COL2COL3爲長格式。其次,你現在可以通過熔化列使用groupby到組,並得到COL1唯一值對每個子組(S1,S2等):

# 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是等價的,可以通過將值疊放兩列長格式,組,找出INT列的獨特元素與set功能:

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