如何用DataFrame对应ColumnA的值替换ColumnB中的nan?
问题:替换DataFrame中NaN值为对应行另一列的值
原始DataFrame:
| ColumnA | ColumnB |
|---|---|
| 1 | nan |
| 2 | 20 |
| 3 | 50 |
| 4 | nan |
| 5 | nan |
| 6 | 100 |
| 7 | 1 |
| 8 | 2 |
需要将ColumnB中的NaN值替换为对应行ColumnA的值,得到目标DataFrame:
| ColumnA | ColumnB |
|---|---|
| 1 | 1 |
| 2 | 20 |
| 3 | 50 |
| 4 | 4 |
| 5 | 5 |
| 6 | 100 |
| 7 | 1 |
| 8 | 2 |
之前尝试用if语句仅替换了第一个值,以下是高效的解决方案:
解决方案
方法1:使用fillna()(最简洁推荐)
pandas的fillna()方法可直接批量填充NaN值,指定用ColumnA的对应值填充ColumnB:
import pandas as pd import numpy as np # 构造原始数据 df = pd.DataFrame({ 'ColumnA': [1,2,3,4,5,6,7,8], 'ColumnB': [np.nan,20,50,np.nan,np.nan,100,1,2] }) # 执行替换 df['ColumnB'] = df['ColumnB'].fillna(df['ColumnA'])
方法2:使用mask()明确指定替换条件
通过mask()标记需要替换的位置(ColumnB为NaN时),替换为ColumnA的值:
df['ColumnB'] = df['ColumnB'].mask(pd.isna(df['ColumnB']), df['ColumnA'])
方法3:使用where()反向逻辑替换
当ColumnB是NaN时保留ColumnA的值,否则保留ColumnB原值:
df['ColumnB'] = df['ColumnA'].where(pd.isna(df['ColumnB']), df['ColumnB'])
为什么if语句只替换了第一个值?
手动编写的if语句通常是逐行遍历但未正确循环所有行,或者仅处理了第一个匹配的NaN。而上述pandas方法都是向量化操作,会批量处理所有符合条件的行,不会遗漏任何NaN值。
内容的提问来源于stack exchange,提问作者Aragorn64
相关产品推荐
相关产品推荐

