Pandas groupby:连接而不调整大小

时间:2016-12-08 20:46:36

标签: python pandas

我有一个包含4列的pandas数据框:

Col1 Col2 Col3 Col4
A1    B1   C1   X1
A2    B2   C2   X2
A3    B3   C3   X3
A1    B1   C1   X4
A4    B4   C4   X5
A3    B3   C3   X6

我想识别col1,col2和col3中具有相同值的行,然后在其对应的col4中连接这些值。所以输出就像:

Col1 Col2 Col3 Col4
A1    B1   C1   X1, X4
A2    B2   C2   X2
A3    B3   C3   X3, X6
A1    B1   C1   X4, X1
A4    B4   C4   X5
A3    B3   C3   X6, X3

数据框的最终形状与原始数据框相同。如果你有人能指出我正确的方向,那就太棒了。感谢

2 个答案:

答案 0 :(得分:0)

a = (df
     .groupby(['Col1', 'Col2', 'Col3'])['Col4']
     .apply(lambda x: ', '.join(sorted(x)))
    )
b = (df
     .groupby(['Col1', 'Col2', 'Col3'])['Col4']
     .apply(lambda x: ', '.join(sorted(x, reverse=True)))
    )
pd.concat([a, b]).drop_duplicates().reset_index()

输出:

  Col1 Col2 Col3    Col4
0   A1   B1   C1  X1, X4
1   A2   B2   C2      X2
2   A3   B3   C3  X3, X6
3   A4   B4   C4      X5
4   A1   B1   C1  X4, X1
5   A3   B3   C3  X6, X3

答案 1 :(得分:0)

使用transform而不是apply或agg。

df['Col4'] = df.groupby(['Col1', 'Col2', 'Col3']).transform(lambda x: ', '.join(x.tolist()))

  Col1 Col2 Col3    Col4
0   A1   B1   C1  X1, X4
1   A2   B2   C2      X2
2   A3   B3   C3  X3, X6
3   A1   B1   C1  X1, X4
4   A4   B4   C4      X5
5   A3   B3   C3  X3, X6