Pandas groupby:连接而不调整大小

2024-04-20 10:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有4列的熊猫数据框:

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

数据帧的最终形状与原始数据帧相同。如果你能给我指出正确的方向那就太好了。谢谢


Tags: 数据a1a3b1col2col3col1b3
2条回答
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

使用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

相关问题 更多 >