Pandas 计数并求和特定条件

2025-03-11 08:54:00
admin
原创
65
摘要:问题描述:pandas 中是否有单个函数可以执行与SUMIF等效的功能(对特定条件求和)和COUNTIF 等效的功能(对 Excel 中特定条件的值进行计数)?我知道有很多多步函数可以用于例如对于sumif我可以使用(df.map(lambda x: condition) or df.size())然后使用....

问题描述:

pandas 中是否有单个函数可以执行与SUMIF等效的功能(对特定条件求和)和COUNTIF 等效的功能(对 Excel 中特定条件的值进行计数)?

我知道有很多多步函数可以用于

例如对于sumif我可以使用(df.map(lambda x: condition) or df.size())然后使用.sum(),对于countif,我可以使用(groupby functions并寻找我的答案或者使用过滤器和.count())

是否有简单的一步过程来执行这些功能,您输入条件和数据框并获得总和或计数结果?


解决方案 1:

您可以先进行条件选择,然后使用函数总结选择的结果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

如果你想这样做COUNTIF,只需替换sum()count()

解决方案 2:

您没有提到数据框的奇特索引功能,例如:

>>> 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用另一种条件来替换。

解决方案 3:

我通常在逻辑条件列上使用 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

在我看来,这比上面提出的解决方案略短

解决方案 4:

对于多个条件(例如 COUNTIFS/SUMIFS),一种方便的方法是query,因为它对于大框架(性能实际上很重要)非常快,并且您不必担心括号、按位与等。例如,要计算=SUMIFS(C2:C8, A2:A8,">1", B2:B8, "<3"),您可以使用

df.query("A>1 and B<3")['C'].sum()
# or 
df.iloc[:8].query("A>1 and B<3")['C'].sum()    # where the range is specified as in SUMIFS

对于 COUNTIFS,您可以简单地对条件求和。例如,要计算=COUNTIFS(A2:A8,">0", B2:B8, "<3"),您可以执行以下操作:

countifs = ((df['A']>1) & (df['B']<3)).sum()

或者直接调用query并计算结果的长度。

countifs = len(df.query("A>1 and B<3"))

您还可以使用类似于将范围输入到 COUNTIFS 的方式指定范围iloc

countifs = len(df.iloc[:8].query("A>1 and B<3"))

要执行按行 COUNTIF/SUMIF,可以使用axis=1参数。同样,范围以列的列表形式给出(['A', 'B']),类似于将范围输入到 COUNTIF 的方式。

同样对于 COUNTIF(类似于 pandas 中 COUNTIFS 的等价物),只需对条件求和,而对于 SUMIF,我们需要对框架进行索引。

df['COUNTIF'] = (df[['A', 'B']] > 1).sum(axis=1)
df['SUMIF'] = df[df[['A', 'B']] > 1].sum(axis=1)
# equivalently, we can use `where` to make a filter as well
df['SUMIF'] = df.where(df[['A', 'B']] > 1, 0).sum(axis=1)

# can use `agg` to compute countif and sumif in one line.
df[['COUNTIF', 'SUMIF']] = df[df[['A', 'B']] > 1].agg(['count', 'sum'], axis=1)

res1

要执行按列的 COUNTIF/SUMIF,您可以使用axis=0参数(默认情况下)。这里的范围(前 3 行)是使用 选择的iloc

df.loc['COUNTIF'] = (df.iloc[:3] > 1).sum()
df.loc['SUMIF'] = df.where(df.iloc[:3] > 1, 0).sum()
# or
df.loc['SUMIF'] = df[df.iloc[:3] > 1].sum()

res2

对于跨多行/列的 COUNTIF/SUMIF,例如=COUNTIF(A2:B4, ">1"),调用sum两次(一次用于按列求和,然后用于跨列求和)。

countif = (df.iloc[:4, :2]>1).sum().sum()    # the range is determined using iloc
sumif = df[df.iloc[:4, :2] > 1].sum().sum()  # first 4 rows and first 2 columns
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2783  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1708  
  产品配置管理在企业产品研发与生产过程中扮演着至关重要的角色,它能够确保产品在不同阶段的一致性、可追溯性以及高效的变更管理。PLM(产品生命周期管理)系统作为整合产品全生命周期信息的平台,为产品配置管理提供了强大的支持。随着技术的不断发展,到2025年,PLM系统在支持产品配置管理方面将有一系列值得关注的技术实践。基于人...
plm系统主要干什么的   0  
  敏捷迭代周期与 PLM 流程的适配是现代企业在产品开发过程中面临的重要课题。随着市场竞争的加剧和技术的快速发展,企业需要更加高效、灵活的产品开发模式,以满足客户不断变化的需求。敏捷迭代周期强调快速响应变化、持续交付价值,而 PLM 流程则侧重于产品全生命周期的管理和控制。如何将两者有机结合,优化交付节奏,成为提升企业竞...
plm是什么意思   0  
  在企业的数字化转型进程中,PLM(产品生命周期管理)与ERP(企业资源计划)作为两款重要的企业级系统,发挥着关键作用。然而,很多企业人员对它们之间的区别以及协同逻辑并不十分清晰。深入了解这两者的差异与协同方式,有助于企业更好地规划信息化建设,提升整体运营效率。PLM系统概述PLM系统聚焦于产品从概念设计到退役的全生命周...
国产plm软件   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用