如何使用熊猫对符合给定条件的列中的值求和?


74

假设我有一个像这样的列:

a   b  
1   5   
1   7
2   3
1   3
2   5

例如,我想总结bwhere的值a = 1。这会给我5 + 7 + 3 = 15

如何在熊猫中做到这一点?

Answers:


122

这里的基本思想是选择要求和的数据,然后将它们求和。可以通过几种不同的方式来选择数据,以下显示了其中几种。

布尔索引

可以说,选择值的最常见方法是使用布尔索引

使用此方法,您可以找出列“ a”等于哪里1,然后将列“ b”的相应行求和。您可以loc用来处理行和列的索引:

>>> df.loc[df['a'] == 1, 'b'].sum()
15

布尔索引可以扩展到其他列。例如,如果df还包含列“ c”,并且我们想对“ b”中的行求和,其中“ a”为1,而“ c”为2,则可以这样写:

df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()

询问

选择数据的另一种方法是用于query过滤您感兴趣的行,选择列“ b”,然后求和:

>>> df.query("a == 1")['b'].sum()
15

同样,该方法可以扩展为对数据进行更复杂的选择:

df.query("a == 1 and c == 2")['b'].sum()

请注意,这比布尔索引方法更简洁。

通过...分组

另一种方法是groupby根据“ a”列中的值将DataFrame分为多个部分。然后,您可以将每个部分相加并得出1的总和:

>>> df.groupby('a')['b'].sum()[1]
15

这种方法可能比使用布尔索引慢,但如果要检查column中其他值的总和,该方法很有用a

>>> df.groupby('a')['b'].sum()
a
1    15
2     8

这是什么.b部分?您如何索引这样的列?
adijo 2015年

您可以a通过编写df['a']或访问DataFrame的列df.a。第二种方法很方便,但是如果您有一个包含多个单词的列名(如“ person id”),或者该列名与诸如“ where”或“ sum”之类的DataFrame方法重合,那么第二种方法将不能很好地工作。
Alex Riley 2015年

好的,谢谢,我还如何将列中的所有值转换为,int从而使它们能够求和?我曾经map将所有这些都转换为,ints但是我认为熊猫中可能有一个内置函数来更有效地执行此操作。
adijo 2015年

1
您可以编写df['a'] = df['a'].astype(int)df['a'] = df['a'].convert_objects(convert_numeric=True)执行此操作。
Alex Riley 2015年

3
@LucSpan:绝对可以写df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()得出这些值的和。
亚历克斯·莱利

2

您也可以不使用groupby或loc来执行此操作。通过简单地将条件包括在代码中。令数据框的名称为df。然后,您可以尝试:

df[df['a']==1]['b'].sum()

或者您也可以尝试:

sum(df[df['a']==1]['b'])

另一种方法是使用python的numpy库:

import numpy as np
print(np.where(df['a']==1, df['b'],0).sum())
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.