我有一个示例数据帧,如下所示。我想最终将第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'))