如何将Panda中不同列中具有相同项目的行添加到一起



我有一个示例数据帧,如下所示。我想最终将第1行和第3行分组在一起,因为它们在不同的列中包含相同的项。

x    y      count
a,b  b,a      5
a,c  c,a      2
b,a  a,b      1

我花了很多时间试图解决这个问题,但还没有遇到一个好的解决方案。我应该采取哪些步骤才能到达下面的最终数据帧?

x    y      count
a,b  b,a      5+1
a,c  c,a      2

您可以尝试:

df.groupby((df.x + df.y).str.replace(',', '').apply(lambda x: ''.join(sorted(x)))
).agg({'x': 'first', 'y': 'first', 'count': sum}).reset_index(drop=True)

输出:

x    y  count
0  a,b  b,a      6
1  a,c  c,a      2

方法略有不同。

使用轴=1:上的np.sort按行对x和y排序

cols = ['x', 'y']
df[cols] = np.sort(df[cols].values, axis=1)
x    y  count
0  a,b  b,a      5
1  a,c  c,a      2
2  a,b  b,a      1

然后是标准的groupby aggregate:

df = df.groupby(cols, as_index=False).aggregate(count=('count', 'sum'))
x    y  count
0  a,b  b,a      6
1  a,c  c,a      2

完整代码:

import numpy as np
import pandas as pd
df = pd.DataFrame({
'x': ['a,b', 'a,c', 'b,a'],
'y': ['b,a', 'c,a', 'a,b'],
'count': [5, 2, 1]
})
cols = ['x', 'y']
df[cols] = np.sort(df[cols].values, axis=1)
df = df.groupby(cols, as_index=False).aggregate(count=('count', 'sum'))

最新更新