You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列的字典匹配替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:05:56