基于特定列值的所有行的总和

时间:2019-10-07 08:00:41

标签: python-3.x pandas

我有这样的df:

Index  Parameters   A    B   C   D   E
1      Apple        1    2   3   4   5
2      Banana       2    4   5   3   5
3      Potato       3    5   3   2   1
4      Tomato       1    1   1   1   1
5      Pear         4    5   5   4   3

我想添加所有参数值为“ Apple”,“ Banana”和“ Pear”的行。

输出:

Index  Parameters   A    B   C   D   E
1      Apple        1    2   3   4   5
2      Banana       2    4   5   3   5
3      Potato       3    5   3   2   1
4      Tomato       1    1   1   1   1
5      Pear         4    5   5   4   3
6      Total        7    11  13  11  13

我的努力

  1. df[:,'Total'] = df.sum(axis=1)-可以,但是我只需要特定值,而不是全部
  2. 在我的案例1,2 and 5中使用索引进行了尝试,但是在我最初的df中,索引可能会不时变化,因此拒绝了该解决方案。

在SO上看到了各种答案,但没有一个能解决我的问题!

1 个答案:

答案 0 :(得分:2)

第一个想法是通过Parameters列创建索引,并为sum选择行,最后将索引转换为列:

L = ["Apple" , "Banana" , "Pear"]
df = df.set_index('Parameters')
df.loc['Total'] = df.loc[L].sum()
df = df.reset_index()
print (df)
  Parameters  A   B   C   D   E
0      Apple  1   2   3   4   5
1     Banana  2   4   5   3   5
2     Potato  3   5   3   2   1
3     Tomato  1   1   1   1   1
4       Pear  4   5   5   4   3
5      Total  7  11  13  11  13

或使用Series.isin按成员资格为过滤的行添加新行,并用Total覆盖上一次添加的值:

last = len(df)
df.loc[last] = df[df['Parameters'].isin(L)].sum()
df.loc[last, 'Parameters'] = 'Total'
print (df)
      Parameters  A   B   C   D   E
Index                              
1          Apple  1   2   3   4   5
2         Banana  2   4   5   3   5
3         Potato  3   5   3   2   1
4         Tomato  1   1   1   1   1
5          Total  7  11  13  11  13

另一种类似的解决方案是不首先过滤所有列,然后在一个元素列表中添加值:

df.loc[len(df)] = ['Total'] + df.iloc[df['Parameters'].isin(L).values, 1:].sum().tolist()