【问题标题】:python How to sum over diagonals of data framepython如何对数据框的对角线求和
【发布时间】:2021-09-17 21:42:09
【问题描述】:

假设我有这个数据框:

     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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果DataFrames 和列中的索引相同,则使用DataFrame.stack 和聚合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
    

    【讨论】:

    • 只有一个数据框
    • @user3102103 - 示例数据是第一个和第二个 DataFrame。你能解释更多吗?
    • 第二个是我想要 sum ``` 1 2 3 4 100 8 12 5 14 99 1 6 4 3 98 2 5 4 11 97 5 3 7 2 ``` like 8 ,1+12,2+6+5,5+5+4+14 等
    【解决方案2】:

    我找到了答案:

    digonalsum = pd.concat([df.iloc[:, i].shift(i) for i in range(df.shape[1])], axis=1).sum(axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2023-03-25
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2016-02-15
      相关资源
      最近更新 更多