我有这样的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
我的努力:
df[:,'Total'] = df.sum(axis=1)
-可以,但是我只需要特定值,而不是全部1,2 and 5
中使用索引进行了尝试,但是在我最初的df中,索引可能会不时变化,因此拒绝了该解决方案。在SO上看到了各种答案,但没有一个能解决我的问题!
答案 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()