对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,BB,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


以上是对PythonPandas中两列(双向)组合的计数求和的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>