如何对分组后的Pandas DataFrame执行指定自定义操作?
解决Pandas分组后的两个操作需求
嘿,我来帮你一步步搞定这两个Pandas操作,先从构造示例数据开始:
import pandas as pd # 构造初始DataFrame df = pd.DataFrame({ 'User': ['A', 'A', 'A', 'B', 'B', 'C', 'C'], 'Numbers': [0, 4, 5, 0, 0, 1, 3] })
1. 移除所有Numbers列全为0的用户组
要实现这个需求,我们可以用groupby().filter()方法,精准过滤掉那些Numbers列全为0的分组:
# 过滤掉全为0的用户组 filtered_df = df.groupby('User').filter(lambda group: (group['Numbers'] != 0).any()) print(filtered_df)
执行后输出结果:
User Numbers 0 A 0 1 A 4 2 A 5 5 C 1 6 C 3
简单解释:lambda group: (group['Numbers'] != 0).any()的逻辑是,只要当前分组里存在至少一个非0值,就保留这个分组;反之(全为0)就被剔除,所以用户B的组就被移除了。
2. 计算每个用户组Numbers列的方差
计算分组方差直接用groupby().var()方法就行,Pandas默认计算的是样本方差(除以n-1),刚好和你给出的示例结果匹配:
# 计算每组的方差并重置索引 variance_df = df.groupby('User')['Numbers'].var().reset_index(name='Variance') print(variance_df)
执行后输出结果:
User Variance 0 A 7.0 1 B 0.0 2 C 2.0
顺手验证下结果:
- 用户A的Numbers:0、4、5,均值是3,样本方差为
((0-3)² + (4-3)² + (5-3)²)/(3-1) = (9+1+4)/2 = 7 - 用户B的Numbers全为0,方差自然是0
- 用户C的Numbers:1、3,均值是2,样本方差为
((1-2)² + (3-2)²)/(2-1) = (1+1)/1 = 2
完全符合你的预期~
内容的提问来源于stack exchange,提问作者panaceanoob
相关产品推荐
相关产品推荐

