对PythonPandas中两列(双向)组合的计数求和
我有以下数据框。
>> df = pd.DataFrame.from_dict({'x':['A','C','E','B','F','D','A','D','C','B','D','C','E'],
'y': ['B','D','F','A','D','F','C','F','E','D','B','A','C'],
'count':[3,4,21,4,1,4,5,22,6,7,10,12,13]})
x y count
0 A B 3
1 C D 4
2 E F 21
3 B A 4
4 F D 1
5 D F 4
6 A C 5
7 D F 22
8 C E 6
9 B D 7
10 D B 10
11 C A 12
12 E C 13
我需要找到计数的总和,例如,如果 (x = 'A' 和 y = 'B') 与 (x = 'B' 和 y = 'A') 相加。这适用于所有组合。
所以输出应该是这样的
comb sum
0 A-B 7
1 A-C 17
2 B-D 17
3 C-D 4
4 C-E 6
5 D-F 27
6 E-C 13
7 E-F 21
回答
您可以使用np.sort对列进行排序,然后使用总和将列和 groupby 连接起来:
s = pd.Series(map('-'.join , np.sort(df[['x','y']],axis=1)),name='comb')
out = df.groupby(s)['count'].sum().reset_index(name='Sum_of_Numbers')
print(out)
comb Sum_of_Numbers
0 A-B 7
1 A-C 17
2 B-D 17
3 C-D 4
4 C-E 19
5 D-F 27
6 E-F 21
解释:
首先我们在轴=1 上对 x 和 y 列进行排序,这样我们就得到了组A,B和B,Aas A,B,然后我们使用-.join和 map 函数将它们连接起来
print([*map('-'.join , np.sort(df[['x','y']],axis=1))])
#['A-B', 'C-D', 'E-F', 'A-B', 'D-F', 'D-F', 'A-C',
#'D-F', 'C-E', 'B-D', 'B-D', 'A-C', 'C-E']
一旦我们有了这个列表comb,我们就用name = 创建了一系列这个列表,这样我们就可以将它用作帮助列df.groupby