2017-03-08 28 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