Pandas Groupby 中使用 Lambda 函数统计非零值数量的正确方法

聖光之護
发布: 2025-10-01 17:39:01
原创
403人浏览过

pandas groupby 中使用 lambda 函数统计非零值数量的正确方法

第一段引用上面的摘要:本文旨在帮助读者理解 Pandas groupby 函数与 lambda 函数结合使用时,如何正确统计分组中非零值的数量。通过分析常见的错误用法,解释了为什么 sum() 函数能够得到正确结果,而 count() 函数则不能,并提供了清晰的示例代码进行说明。

在使用 Pandas 进行数据分析时,groupby 函数是一个非常强大的工具,它允许我们将数据按照一个或多个列进行分组,并对每个分组应用聚合函数。结合 lambda 函数,我们可以实现更灵活的自定义聚合操作。然而,在某些情况下,我们可能会遇到一些意想不到的结果,例如,在统计分组中非零值的数量时。

考虑以下示例:

import pandas as pd

data = [['a', 3], ['a', 3], ['b', 1], ['a', 0], ['b', 0]]
df = pd.DataFrame(data, columns=['Room', 'Value'])
print(df)
登录后复制

我们的目标是按照 'Room' 列进行分组,并计算每个房间中 'Value' 列中非零值的数量。一种常见的尝试是使用 count() 函数:

sum_df = df.groupby(['Room']).agg(
    sumValue=('Value', 'sum'),
    nonBlankOccasion=('Value', lambda x: (x > 0).count())
).reset_index()
print(sum_df)
登录后复制

然而,上述代码会得到错误的结果:

   Room  sumValue  nonBlankOccasion
0    a         6                 3
1    b         1                 2
登录后复制

正确的做法是使用 sum() 函数:

sum_df = df.groupby(['Room']).agg(
    sumValue=('Value', 'sum'),
    nonBlankOccasion=('Value', lambda x: (x > 0).sum())
).reset_index()
print(sum_df)
登录后复制

这样才能得到正确的结果:

   Room  sumValue  nonBlankOccasion
0    a         6                 2
1    b         1                 1
登录后复制

原因分析:

问题的关键在于理解 groupby 函数传递给 lambda 函数的参数是什么。实际上,传递给 lambda 函数的参数是一个 Pandas Series 对象,它包含了每个分组中 'Value' 列的值。

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44
查看详情 怪兽AI数字人
sum_df = df.groupby(['Room']).agg(
    nonBlankOccasion=('Value', lambda x: print(type(x > 0)))
).reset_index()
登录后复制

这段代码会输出:

<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
登录后复制

这表明 x > 0 的结果是一个布尔类型的 Pandas Series,其中 True 表示对应的值大于 0,False 表示对应的值小于等于 0。

sum_df = df.groupby(['Room']).agg(
    nonBlankOccasion=('Value', lambda x: print(x > 0))
).reset_index()
登录后复制

这段代码会输出类似如下内容:

0     True
1     True
3    False
Name: Value, dtype: bool
2     True
4    False
Name: Value, dtype: bool
登录后复制

count() 函数的作用是统计 Series 中元素的个数,因此,x.count() 返回的是 Series 的长度,也就是分组中元素的个数,这并不是我们想要的结果。

而 sum() 函数会将 True 视为 1,False 视为 0,因此,x.sum() 返回的是 Series 中 True 的个数,也就是分组中非零值的数量,这才是我们想要的结果。

总结:

当使用 Pandas groupby 函数和 lambda 函数结合进行聚合操作时,需要仔细考虑 lambda 函数的参数类型和返回值。在统计分组中满足特定条件的元素数量时,应该使用 sum() 函数,而不是 count() 函数。因为count()会统计分组内所有元素的数量,而sum()会将True视为1,False视为0,从而正确计算满足条件的元素数量。

以上就是Pandas Groupby 中使用 Lambda 函数统计非零值数量的正确方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号