如何用df1匹配CUSTOMERID的OPEN_DT值替换df2中OPEN_DT的NaN?
解决DataFrame中NaN值匹配替换问题
场景说明
你有两个DataFrame:
- df1:存储每个
CUSTOMERID对应的唯一开户日期(最小日期) - df2:包含重复的
CUSTOMERID,其中OPEN_DT列存在部分NaN值,需要用df1中对应客户的日期替换这些NaN
可行解决方案
方法1:用字典映射快速填充
先将df1转换为客户ID到开户日期的映射字典,再通过map匹配后填充NaN:
# 构建客户ID与开户日期的映射字典 open_dt_mapping = df1.set_index('CUSTOMERID')['OPEN_DT'].to_dict() # 填充df2中的NaN值 df2['OPEN_DT'] = df2['OPEN_DT'].fillna(df2['CUSTOMERID'].map(open_dt_mapping))
方法2:通过关联表结合combine_first替换
先关联两个DataFrame,再优先保留df2原有值,缺失时用df1的对应值:
# 左关联df2和df1,保留df2所有行 merged_df = df2.merge(df1, on='CUSTOMERID', suffixes=('', '_df1'), how='left') # 替换NaN:优先用df2原OPEN_DT,无值则取df1的对应日期 df2['OPEN_DT'] = merged_df['OPEN_DT'].combine_first(merged_df['OPEN_DT_df1']) # 清理临时列(可选) merged_df.drop('OPEN_DT_df1', axis=1, inplace=True)
常见失败原因
之前关联后替换失败,大概率是以下问题:
- 关联方式错误:用了
inner关联导致丢失df2中未匹配到的行 - 未正确处理重复列名:关联后未区分原df2和df1的
OPEN_DT列 - 未使用
fillna或combine_first完成NaN替换,仅做了关联操作
内容的提问来源于stack exchange,提问作者Sarthak Gupta
相关产品推荐
相关产品推荐

