Pandas:用M1或M2列的非NaN值填充B列缺失值
解决B列NaN值填充问题:用M1/M2的非空值替换
直接上能解决问题的代码,完全符合你的需求——只替换B列的NaN,不改动已有的正确值,同时兼顾M1和M2的非空情况:
df.loc[df['B'].isnull(), 'B'] = df['M1'].combine_first(df['M2'])
为什么这个方法管用?
combine_first()是Pandas里专门处理这类“优先取A,A空就取B”场景的神器:
- 它会逐行检查
M1的值,如果M1不是NaN,就用M1的值填充B的NaN; - 如果
M1是NaN(比如你示例里的第五行),就自动取对应行M2的非NaN值; - 完全不会触碰B列已经计算正确的那些行(比如第一、三、四、六行的B值会原封不动保留)。
验证你的示例数据
运行完上面的代码后,你的DataFrame会变成:
| A | M1 | M2 | B |
|---|---|---|---|
| 1 | 1 | 2 | 3 |
| 1 | 2 | NaN | 2 |
| 1 | 3 | 6 | 9 |
| 1 | 4 | 8 | 12 |
| 1 | NaN | 10 | 10 |
| 1 | 6 | 12 | 18 |
完美匹配你想要的结果!
额外小技巧
如果你需要优先用M2的值(而不是M1),只需要调换两个列的顺序就行:
df.loc[df['B'].isnull(), 'B'] = df['M2'].combine_first(df['M1'])
内容的提问来源于stack exchange,提问作者FaCoffee
相关产品推荐
相关产品推荐

