【问题标题】:Pandas Sum Diagonal Value with groupbyPandas 和 groupby 的对角线值
【发布时间】:2019-01-15 08:27:04
【问题描述】:

我想将每年的对角线值和残差相加,按对象分组。例如对象 a 将是 1 + 10 + 11 + 12 + 13。有没有办法在不按对象拆分表的情况下做到这一点?请注意,每个对象的行数可能不同。我试过了: df.groupby('Company').apply(lambda x: x.reset_index().loc[0,'Year_0']+x.reset_index().loc[1,'Year_1']+ x.reset_index()。 loc[2,'Year_2']+x.reset_index().loc[3,'Year_3']) 但它需要定义的行数。谢谢!


Year_0  Year_1  Year_2  Year_3  Residue Company
1       0.0     0.0     0.0      10      a
1       10      0.0     0.0      10      a
1       10       11     0.0      10      a
1       10       11      12      13      a
2       0      0.0      0.0      12      b
2       11     0.0      0.0      12      b
2       11      12      0.0      12      b
2       11      12       13      12      b
-3     0       0.0      0.0      -1      c
-3     -1       0.0     0.0      -1      c
-3     -2       -3      0.0      -1      c

【问题讨论】:

  • 试试groupby公司,然后是trace
  • 预期输出是什么?

标签: python pandas pandas-groupby


【解决方案1】:

我相信您需要drop_duplicates,通过set_indexsum 行和最后一个reset_index 创建索引以将Series 转换为DataFrame

df1 = (df.drop_duplicates('Company', keep='last')
         .set_index('Company')
         .sum(axis=1)
         .reset_index(name='new'))
print (df1)
  Company   new
0       a  47.0
1       b  50.0
2       c  -9.0

或者使用GroupBy.last:

df1 = (df.groupby('Company', as_index=False).last()
       .set_index('Company')
       .sum(axis=1)
       .reset_index(name='new'))

如果想使用对角线值,请使用 numpy.diagonal:

s = df.drop_duplicates('Company', keep='last').set_index('Company')['Residue']

df = (df.drop('Residue', axis=1)
      .set_index('Company')
      .groupby('Company')
      .apply(lambda x: x.values.diagonal().sum())
      .add(s)
      .reset_index(name='new'))
print (df)
  Company   new
0       a  47.0
1       b  50.0
2       c  -8.0

最后一个值为-8,因为-3 + -1 + -3 + -1

【讨论】:

    【解决方案2】:

    或者使用groupby:

    print(df.groupby('Company',as_index=False).tail(1)
              .set_index('Company')
              .sum(axis=1)
              .reset_index(name='new'))
    

    输出:

      Company   new
    0       a  47.0
    1       b  50.0
    2       c  -9.0
    

    【讨论】:

      【解决方案3】:

      使用numpypandas groupby

      df.groupby('Company').apply(lambda x: np.sum(np.ma.diag(x.values)) + x.values[-1][-2])
      

      输出

      Company
      a    47.0
      b    50.0
      c    -8.0
      dtype: float64
      

      【讨论】:

        猜你喜欢
        • 2016-09-15
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        • 2016-02-20
        • 2019-08-16
        相关资源
        最近更新 更多