如何用Pandas按Key匹配查找表替换DataFrame中的空值与NaN值
基于查找表替换DataFrame空值的实现方法
左合并出现多余行的核心原因是lookupDF中存在重复的Key值,合并时会触发笛卡尔积生成重复行,优先推荐更高效、不会变更原df行数的映射替换方案:
方案1:字典映射法(推荐,性能最优)
该方法通过构造Key到Name的映射字典,直接按行匹配替换,时间复杂度为O(n),n为df的行数,完全不受lookupDF规模影响。
实现代码:
import pandas as pd # 第一步:构造查找映射字典,提前对lookupDF按Key去重避免映射冲突 name_map = lookupDF.drop_duplicates(subset='Key', keep='last').set_index('Key')['Name'].to_dict() # 第二步:替换空值,若空值为NaN则将条件改为df['Name'].isna() df['Name'] = df['Name'].mask(df['Name'] == '', df['Key'].map(name_map))
方案2:去重后左合并(适合需要关联更多lookup字段的场景)
如果需要同时关联lookupDF的多个字段,可先对lookupDF去重再合并,避免生成多余行:
实现代码:
# 第一步:对lookupDF按Key去重,保证每个Key仅对应一行 lookup_unique = lookupDF.drop_duplicates(subset='Key', keep='first') # 第二步:左连接关联Name字段,用后缀区分原字段和lookup字段 df_merged = df.merge(lookup_unique[['Key', 'Name']], on='Key', how='left', suffixes=('', '_lookup')) # 第三步:替换空值后删除多余字段 df_merged['Name'] = df_merged['Name'].mask(df_merged['Name'] == '', df_merged['Name_lookup']) df = df_merged.drop(columns=['Name_lookup'])
注意事项
- 若df中存在lookupDF没有的Key,映射后会返回NaN,原有空值不会被覆盖,符合业务逻辑
- 两种方案均不会改变原df的行数,也不会受lookupDF规模大于df的影响
内容的提问来源于stack exchange,提问作者EnnFour
相关产品推荐
相关产品推荐

