如何基于另一列的字典匹配替换pandas DataFrame中列的NaN值
基于列匹配的DataFrame NaN值替换
给定包含NaN的pandas DataFrame:
import numpy as np import pandas as pd bad_df = pd.DataFrame({'foo': [np.nan, 1.0, 2.0], 'bar': ['a', 'b', 'c']})
同时有一个替换字典,键与bar列的部分值对应:
replace_values = {'a': 7.0, 'd': 10.0}
需求是:根据bar列的值匹配字典键,用对应的值替换foo列中的NaN,最终得到如下结果:
expected_df = pd.DataFrame({'foo': [7.0, 1.0, 2.0], 'bar': ['a', 'b', 'c']})
常规的fillna或replace方法无法直接实现(它们只能用单一值批量替换),可以用以下两种方法解决:
方法1:map结合fillna
利用map根据bar列生成对应字典值,再填充foo的NaN:
bad_df['foo'] = bad_df['foo'].fillna(bad_df['bar'].map(replace_values))
- 原理:
bad_df['bar'].map(replace_values)会为每个bar值匹配字典中的对应值,不存在的键返回NaN;fillna仅将foo中的NaN替换为匹配到的有效字典值,不改变其他行的foo值。
方法2:loc定位条件行赋值
先筛选出符合条件的行(foo为NaN且bar在字典键中),再直接赋值:
# 生成筛选掩码 mask = bad_df['foo'].isna() & bad_df['bar'].isin(replace_values.keys()) # 为符合条件的行赋值 bad_df.loc[mask, 'foo'] = bad_df.loc[mask, 'bar'].map(replace_values)
- 原理:通过掩码精准定位需要修改的行,避免对其他行产生影响,适合需要严格控制修改范围的场景。
运行上述任意方法后,bad_df即可达到预期结果。
内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil
相关产品推荐
相关产品推荐

