熊猫与groupby的对角线值

时间:2019-01-15 08:27:04

标签: python pandas pandas-groupby

我想将每年和残差的对角线值相加,按对象分组。例如对于对象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

3 个答案:

答案 0 :(得分:1)

我认为您需要drop_duplicates,按set_indexsum行和最后reset_index创建索引,以将Series转换为DataFrame:< / p>

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

答案 1 :(得分:1)

或使用--no-deps

groupby

输出:

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

答案 2 :(得分:1)

使用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