Pandas DataFrame按a、b分组填充c列None值问题
解决Pandas分组填充None值的问题
你的需求很明确——按a和b的组合分组,用每组c列的均值填充组内的None值。先说说你原来代码的问题,再给你高效的解决方案:
你原有代码的问题
- 布尔索引写法错误:你写的
df[df[('a'==1) & ('b'==1)]]完全不对。首先'a'==1是字符串和数字比较,结果永远是False,导致筛选不到任何行;其次正确的筛选方式应该是df[(df['a'] == 1) & (df['b'] == 1)],用括号把每个条件包起来,再用&连接。 - 只能处理单个分组:这种写法要手动指定每个
a和b的组合,要是分组多的话,重复代码会非常繁琐,完全不高效。
正确的实现方法
用groupby结合transform是最简洁高效的方式,它会自动对每个分组计算均值并填充对应行的None:
步骤1:先构造你的DataFrame(方便测试)
import pandas as pd # 构造你给出的数据集 df = pd.DataFrame({ 'a': [1,1,1,1,1,1,2,2,2,2,2], 'b': [1,1,1,2,2,2,1,1,1,2,2], 'c': [5.0, None, 4.0, 1.0, 1.0, 4.0, 3.0, 2.0, None, 3.0, 4.0] })
步骤2:分组填充None值
# 按a和b分组,对每个分组的c列用组内均值填充None df['c'] = df.groupby(['a', 'b'])['c'].transform(lambda x: x.fillna(x.mean()))
结果验证
执行后你的DataFrame会变成:
| a | b | c |
|---|---|---|
| 1 | 1 | 5.0 |
| 1 | 1 | 4.5 |
| 1 | 1 | 4.0 |
| 1 | 2 | 1.0 |
| 1 | 2 | 1.0 |
| 1 | 2 | 4.0 |
| 2 | 1 | 3.0 |
| 2 | 1 | 2.0 |
| 2 | 1 | 2.5 |
| 2 | 2 | 3.0 |
| 2 | 2 | 4.0 |
代码解释
groupby(['a', 'b']):将DataFrame按a和b的唯一组合分成多个子组;transform:会把每个分组的计算结果(这里是填充后的c列)映射回原DataFrame对应的行,保证索引对齐;lambda x: x.fillna(x.mean()):对每个分组的c列,用该分组的均值填充其中的None值。
内容的提问来源于stack exchange,提问作者user495490
相关产品推荐
相关产品推荐

