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

如何用Lookup表填充Pandas数据表中的NaN值(col_a含重复值场景)

嘿,我懂你的需求——想用lookup_df来填充df1里的NaN值,但又怕col_a有重复值,用左连接会搞出多余的行对吧?别慌,这几个方法完全能满足你的要求,而且不会引入额外的行:

前提说明

首先得确认你的lookup_df里的col_a是唯一值哦!毕竟是查找表,同一个key对应多个值的话,填充逻辑会混乱,这是基础前提哈。

方法1:map() + fillna()(单列填充首选)

如果只是填充某一列,这个方法最直接高效。先把lookup表转成键值对字典,再用df1的col_a去匹配,最后填充NaN:

import pandas as pd
import numpy as np

# 假设要填充df1的col_b列,lookup_df有col_a和col_b的对应关系
lookup_dict = lookup_df.set_index('col_a')['col_b'].to_dict()

# 用map匹配对应值,再填充原列的NaN
df1['col_b'] = df1['col_b'].fillna(df1['col_a'].map(lookup_dict))

不管df1的col_a有多少重复,这个方法只会按对应值填充NaN,不会新增行,完美解决你的顾虑。

方法2:combine_first()(多列填充首选)

如果需要填充多列,这个方法更省心,不用逐个列处理。原理是把两个表按col_a对齐,保留df1的非NaN值,用lookup表的值补全NaN:

# 把lookup_df设置索引为col_a,方便和df1对齐
lookup_indexed = lookup_df.set_index('col_a')

# 对齐后填充,最后重置索引恢复原结构
df1_filled = df1.set_index('col_a').combine_first(lookup_indexed).reset_index()

这个方法会自动处理所有列的NaN填充,同样不会因为col_a重复产生额外行。

方法3:replace()(灵活替换)

和第一个方法类似,用replace直接替换NaN值:

lookup_dict = lookup_df.set_index('col_a')['col_b'].to_dict()
df1['col_b'] = df1['col_b'].replace(np.nan, df1['col_a'].map(lookup_dict))

效果和方法1一致,看你个人习惯选用。

注意事项

  • 如果df1的col_a里存在lookup_df没有的取值,对应的NaN会保留,你可以根据需求加个fillna('默认值')收尾;
  • 一定要保证lookup_df的col_a无重复,否则转字典时后面的条目会覆盖前面的,导致填充结果不准确。

内容的提问来源于stack exchange,提问作者himi64

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:05:05