如何用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
相关产品推荐
相关产品推荐

