首页 > 解决方案 > python如何对数据框的对角线求和

问题描述

假设我有这个数据框:

     1   2   3   4      
100  8   12  5   14 
99   1   6   4   3   
98   2   5   4   11  
97   5   3   7   2   

在上述数据框中,这些值表示对 (100, 1)、(99, 1) 等进行多少观察的计数。

在我的上下文中,对角线具有相同的含义:

     1   2   3   4
100  A   B   C   D 
99   B   C   D   E  
98   C   D   E   F 
97   D   E   F   G

我将如何在第一个数据框中对对角线求和(即,对相似字母的计数求和)?

这将产生:

group  sum
A      8
B      13
C      13
D      28
E      10
F      18
G      2

For example, D is 5+5+4+14

标签: pythonpandasdataframe

解决方案


如果DataFrames 和 columns 中的索引相同,则使用DataFrame.stackwith aggregate sum

df = df1.stack().groupby(df2.stack()).sum().rename_axis('group').reset_index(name='sum')
print (df)
  group  sum
0     A    8
1     B   13
2     C   13
3     D   28
4     E   10
5     F   18
6     G    2

编辑:因为第二个 DataFrame 不存在使用和numpy.diag翻转:numpy.flipudsum

#inspired by https://stackoverflow.com/a/59173028/2901002
c = df.to_numpy()
v = [np.sum(np.diag(np.flipud(c), k=i)) for i in range(-len(df) + 1, len(df), 1)]
print(v) 
[8, 13, 13, 28, 10, 18, 2]

df = pd.DataFrame({'sum': v})
print (df)
   sum
0    8
1   13
2   13
3   28
4   10
5   18
6    2

推荐阅读