基于另一列条件替换Pandas列值的实现方法
Pandas:仅当Column B非空时替换Column A的值
问题场景
我们有如下初始DataFrame,需要实现仅当Column B的值不为NaN时,将Column A替换为Column B的对应值,之后按Column A分组聚合Column C的和。
初始DataFrame
import pandas as pd import numpy as np df = pd.DataFrame({'Column A' : ['red','green','yellow', 'orange', 'red', 'blue'], 'Column B' : [np.nan, 'blue', 'purple', np.nan, np.nan, np.nan], 'Column C' : [1, 2, 3, 2, 3, 7]})
| Column A | Column B | Column C |
|---|---|---|
| 'red' | NaN | 1 |
| 'green' | 'blue' | 2 |
| 'yellow' | 'purple' | 3 |
| 'orange' | NaN | 2 |
| 'red' | NaN | 3 |
| 'blue' | NaN | 7 |
期望处理后结果
| Column A | Column B | Column C |
|---|---|---|
| 'red' | NaN | 1 |
| 'blue' | 'blue' | 2 |
| 'purple' | 'purple' | 3 |
| 'orange' | NaN | 2 |
| 'red' | NaN | 3 |
| 'blue' | NaN | 7 |
最优解决方案
直接使用pandas的矢量化操作fillna(),一行代码完成需求:
df['Column A'] = df['Column B'].fillna(df['Column A'])
原理说明
fillna()会遍历Column B的每一个值:
- 当值不为NaN时,直接保留该值作为
Column A的新值 - 当值为NaN时,用
Column A的原始值填充,完全匹配需求
这种方法无需硬编码索引,能自适应数据的新增、删除或索引变化,而且是矢量化操作,处理大数据集时效率远高于逐行处理的apply()。
备选方案(逐行处理,不推荐)
如果一定要用apply()实现,也可以写,但效率较低:
df['Column A'] = df.apply(lambda row: row['Column B'] if pd.notna(row['Column B']) else row['Column A'], axis=1)
验证聚合结果
处理完成后执行分组求和:
agg_result = df[['Column A', 'Column C']].groupby('Column A').sum() print(agg_result)
输出结果:
Column C Column A blue 9 orange 2 purple 3 red 4
内容的提问来源于stack exchange,提问作者James Adams
相关产品推荐
相关产品推荐

