
本文旨在解释 Pandas groupby 函数结合 lambda 表达式时,如何正确地统计分组后非零值的数量。通过示例代码,详细阐述了 sum() 和 count() 在此场景下的区别,以及为什么 sum() 能够得到期望结果的原因。
Pandas 的 groupby 函数是数据分析中常用的工具,它允许我们将数据按照特定的列进行分组,并对每个分组应用聚合函数。当需要自定义聚合逻辑时,lambda 表达式往往能派上用场。然而,在某些情况下,lambda 表达式的使用可能会产生意想不到的结果。本文将通过一个具体的例子,深入探讨在 groupby 中使用 lambda 表达式计数非零值时,sum() 和 count() 的区别。
示例代码与问题分析
首先,我们创建一个 Pandas DataFrame:
import pandas as pd data = [['a', 3], ['a', 3], ['b', 1], ['a', 0], ['b', 0]] df = pd.DataFrame(data, columns=['Room', 'Value']) print(df)
这段代码会输出如下 DataFrame:
Room Value 0 a 3 1 a 3 2 b 1 3 a 0 4 b 0
我们的目标是按照 '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
nonBlankOccasion 列的值并不是我们期望的非零值的个数,而是每个分组的记录总数。
接下来,我们尝试使用 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
nonBlankOccasion 列的值正确地反映了每个房间对应的 'Value' 列中非零值的个数。
原因分析
为什么 sum() 能够得到正确的结果,而 count() 却不行呢?关键在于 lambda 表达式的参数 x 的类型。在 groupby 的 agg 函数中,lambda 表达式的参数 x 是一个 Pandas Series,包含了每个分组的 'Value' 列的值。
为了更清楚地理解这一点,我们可以打印出 lambda 表达式的参数类型:
sum_df = df.groupby(['Room']).agg(
nonBlankOccasion=('Value', lambda x: print(type(x > 0)))
).reset_index()运行这段代码会输出:
这表明 x > 0 的结果是一个 Pandas Series,包含了布尔值 True 和 False,分别对应于 'Value' 列中大于 0 和小于等于 0 的值。
当我们使用 count() 时,实际上是对这个布尔类型的 Series 进行计数,而 count() 函数会统计 Series 中所有元素的个数,无论其值为 True 还是 False。因此,count() 得到的是每个分组的记录总数,而不是非零值的个数。
当我们使用 sum() 时,由于 True 在数值上等同于 1,False 在数值上等同于 0,因此 sum() 函数会将 Series 中所有 True 值的个数加起来,从而得到非零值的个数。
总结与注意事项
- 在 Pandas groupby 中使用 lambda 表达式时,要特别注意 lambda 表达式的参数类型,以及聚合函数的作用。
- 当需要统计分组后非零值的个数时,应该使用 sum() 而不是 count()。
- 这种方法适用于数值型数据,如果数据类型不是数值型,需要先将其转换为数值型。
- 确保理解 True 和 False 在数值运算中的含义,这有助于理解为什么 sum() 能够得到正确的结果。
通过本文的分析,我们深入理解了 Pandas groupby 函数结合 lambda 表达式时,如何正确地统计分组后非零值的数量。希望本文能够帮助读者更好地掌握 Pandas 的数据分析技巧。










