分组和联接值,但保留所有列

时间:2019-09-03 09:43:15

标签: python python-3.x pandas pandas-groupby

我有这个数据框,想对ID分组并加入值。

ID  | A_Num | I_Num
--------------------------
001 | A_001 | I_001
002 | A_002 | I_002
003 | A_003 | I_004
005 | A_002 | I_002

所需的输出

ID      | A_Num | I_Num
--------------------------
001     | A_001 | I_001
002;005 | A_002 | I_002
003     | A_003 | I_004

代码:

    df = df.groupby(['A_Num','I_Num'])['ID'].apply(lambda tags: ';'.join(tags))
    df.to_csv('D:\joined.csv', sep=';', encoding='utf-8-sig', quoting=csv.QUOTE_ALL, index=False, header=True)

当我将DataFrame写入csv文件时,我只有ID列。

3 个答案:

答案 0 :(得分:3)

尝试reset_index()

df=df.groupby(['A_Num','I_Num'])["ID"].apply(lambda tags: ';'.join(tags.values)).reset_index()

这样,将执行您从apply()进行的聚合,然后将其重新分配为column而不是index

答案 1 :(得分:0)

另一种实现方法是:

result= df.groupby(['A_Num', 'I_Num']).agg({'ID': list})
result.reset_index(inplace=True)
result[['ID', 'A_Num', 'I_Num']]

输出为:

Out[37]: 
             ID    A_Num   I_Num
0        [001 ]   A_001    I_001
1  [002 , 005 ]   A_002    I_002
2        [003 ]   A_003    I_004
在这种情况下,

ID包含列表。如果您想使用字符串,请执行以下操作:

result['ID']= result['ID'].map(lambda lst: ';'.join(lst))
result[['ID', 'A_Num', 'I_Num']]

哪个输出:

Out[48]: 
        ID  A_Num  I_Num
0      001  A_001  I_001
1  002;005  A_002  I_002
2      003  A_003  I_004

答案 2 :(得分:0)

按“ A_Num”和“ I_Num”分组,然后将ID合并到相同的组中。

df.groupby(['A_Num','I_Num']).ID.apply(lambda x: ';'.join(x.tolist())).reset_index()