基于共同列替换DataFrame列值返回NaN,求原因及修复方法
问题:DataFrame替换列值返回NaN的原因及修复方案
场景重现
现有两个DataFrame:
hec_df:
| 事故年份 | factor | age |
|---|---|---|
| 2007 | 1.5 | 13 |
| 2008 | 1.6 | 11 |
| 2009 | 1.7 | 15 |
hec_ldfs:
| 事故年份 | factor |
|---|---|
| 2007 | 1.6 |
| 2008 | 1.64 |
| 2009 | 1.7 |
目标是将hec_df的factor列替换为hec_ldfs中对应年份的值,使用代码:
hec_df['factor'] = hec_df['factor'].map(hec_ldfs.set_index('accident year')['factor'])
运行后factor列全为NaN,需排查原因并修复。
原因分析
- 列名不匹配:代码中使用
'accident year'作为索引列,但实际两个DataFrame的年份列名为'事故年份',导致hec_ldfs无法正确设置索引,后续匹配完全失效。 - map逻辑错误:你用hec_df的
factor列值去匹配hec_ldfs的索引,但hec_ldfs的索引(若列名正确)是年份值而非factor值,两者无对应关系,自然返回NaN。
修复方案
方案1:修正map的使用逻辑(推荐)
基于事故年份列进行匹配,确保列名正确:
# 先将hec_ldfs以事故年份为索引提取factor列,再用hec_df的事故年份映射 hec_df['factor'] = hec_df['事故年份'].map(hec_ldfs.set_index('事故年份')['factor'])
方案2:用merge合并后替换
若需保留更多字段,merge是更直观的方式:
# 以事故年份为键合并两个DataFrame merged_df = hec_df.merge(hec_ldfs, on='事故年份', suffixes=('_old', '')) # 保留目标列,替换原factor hec_df = merged_df[['事故年份', 'factor', 'age']]
额外检查:数据类型一致性
确保两个DataFrame的事故年份列数据类型一致(如均为int或str),可通过df.dtypes查看,若不一致用astype转换:
# 统一转换为int类型 hec_df['事故年份'] = hec_df['事故年份'].astype(int) hec_ldfs['事故年份'] = hec_ldfs['事故年份'].astype(int)
内容的提问来源于stack exchange,提问作者ntwong
相关产品推荐
相关产品推荐

