在GroupBy.agg中用Lambda求过滤后数据均值的问题
问题:分组后DataFrame如何提取过滤后数据的均值?
我在分组后的DataFrame中提取过滤后数据的均值时遇到问题:sum()函数能正常统计符合条件的记录数,但mean()返回的是符合条件的记录占总记录数的比例,不是我需要的过滤后数据的均值。
当前代码示例
df = test.groupby(['Code']).agg( Count=('% Change', 'count'), H2C_Up_Mean=('% C2H',lambda x: (x > 0).mean()), H2C_Pct_Up=('% C2H',lambda x: (x > 0).sum()) )
H2C_Pct_Up的结果与手动统计一致,是正确的;但H2C_Up_Mean得到的是H2C_Pct_Up除以Count的比例,不是过滤后数据的均值。
示例DataFrame
| code | % change | % C2H |
|---|---|---|
| abc | 0.50 | 0.75 |
| abc | 1.00 | 0.25 |
| abc | -0.25 | -0.50 |
期望输出
- Count: 3(正确)
- H2C_Pct_Up: 2(正确)
- H2C_Up_Mean: 0.50(当前得到0.667,不符合预期)
解决方案
要计算过滤后(% C2H > 0)数据的均值,需要先筛选出分组中符合条件的数值,再对这些数值求均值,而不是对布尔值求均值。
修改后的代码:
df = test.groupby(['Code']).agg( Count=('% Change', 'count'), H2C_Up_Mean=('% C2H', lambda x: x[x > 0].mean()), H2C_Pct_Up=('% C2H', lambda x: (x > 0).sum()) )
原理说明
x[x > 0]会筛选出当前分组中% C2H大于0的所有数值;- 对筛选后的结果调用
mean(),得到的就是符合条件数据的均值,而非比例。
针对示例数据,筛选后的值为[0.75, 0.25],均值为(0.75 + 0.25)/2 = 0.5,与期望输出一致。
内容的提问来源于stack exchange,提问作者jrcart
相关产品推荐
相关产品推荐

