Pandas按分组聚合过滤DataFrame:解决组内均值比较报错问题
解决分组均值筛选异常值的索引匹配问题
问题根源
直接用groupby(["Group", "Sub"]).mean()得到的是聚合后的小数据集,和原DataFrame的行结构、索引完全不匹配,所以直接比较会触发ValueError。
可行方案:用transform映射分组均值到原数据
transform方法能将分组计算的结果按原DataFrame的行结构返回,完美解决索引匹配问题,具体实现如下:
完整代码
import pandas as pd df = pd.DataFrame({ "Group": ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'], "Sub": ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], "Values": [1, 2, 3, 10, 20, 10, 25, 100, 75, 1500, 1600, 1800] }) # 为每行添加对应分组的均值 df['group_mean'] = df.groupby(["Group", "Sub"])['Values'].transform('mean') # 筛选Values大于组均值的行 filtered_df = df[df['Values'] > df['group_mean']] print(filtered_df)
代码解释
transform('mean')会遍历每个Group-Sub分组,将该组的均值填充到原DataFrame中属于该组的每一行,生成的列和原数据长度完全一致。- 后续直接通过布尔索引筛选,不存在任何索引不匹配问题。
输出结果
Group Sub Values group_mean 3 A A 10 5.5 4 A B 20 11.0 5 A C 10 6.5 9 B A 1500 762.5 10 B B 1600 850.0 11 B C 1800 937.5
内容的提问来源于stack exchange,提问作者S7ewie
相关产品推荐
相关产品推荐

