Python Pandas计数和求和特定条件


73

大熊猫中是否有单个函数来执行SUMIF的等价功能(对特定条件求和)和COUNTIF(对Excel中的特定条件的值进行计数)?

我知道有许多多步功能可用于

例如sumif我可以使用(df.map(lambda x: condition), or df.size())然后使用.sum()

因为countif我可以使用(groupby functions并寻找答案,或者使用过滤器和.count())

在输入条件和数据框并获得总和或计数结果时,是否有简单的一步过程即可完成这些功能?

Answers:


93

您可以先进行条件选择,然后使用该sum函数汇总选择的结果。

>> df = pd.DataFrame({'a': [1, 2, 3]})
>> df[df.a > 1].sum()   
a    5
dtype: int64

有多个条件:

>> df[(df.a > 1) & (df.a < 3)].sum()
a    2
dtype: int64

4
如果您有两个或更多不同的列并且想要多个条件,该怎么办?
user3084006 2014年

只需将第二个示例中选定的列之一更改为另一个列名。
Jimmy C

3
@JimmyC:您的答案提供了SUMIF的代码,但没有提供COUNTIF的代码,对吗?
stackoverflowuser2010

3
@ stackoverflowuser2010对。如果您想做COUNTIF,只需将sum()替换为count()
Jimmy C,

42

您没有提到数据帧的精美索引功能,例如:

>>> df = pd.DataFrame({"class":[1,1,1,2,2], "value":[1,2,3,4,5]})
>>> df[df["class"]==1].sum()
class    3
value    6
dtype: int64
>>> df[df["class"]==1].sum()["value"]
6
>>> df[df["class"]==1].count()["value"]
3

您可以用df["class"]==1其他条件代替。


我的代码中也有此代码,但是如果您有多个条件该怎么办?例如,如果我想要 df[df["class"]==1].count()["value"]df[df["value"]==2].count()["class"]
user3084006 2014年

1
吉米·C(Jimmy C)提出了多个条件的组合,因此在我的帖子中不再赘述。还有什么想念的吗?
Thorsten Kranz 2014年

4
一种获得计数的更简单方法是len(df[df["class"]==1])
beldaz

8

我通常在逻辑条件列上使用numpy sum:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'Age' : [20,24,18,5,78]})
>>> np.sum(df['Age'] > 20)
2

在我看来,这比上述解决方案略短

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.