基于同类型变量合并DataFrame出现NaN值问题求助
解决DataFrame合并后population列大量NaN的问题
核心排查方向
合并后出现大量NaN,核心原因是**stadsdeel字段取值不匹配**(2014-2015年的NaN属于正常范围,因为df2没有这两年的数据),以下是具体排查和解决步骤:
1. 定位字段取值差异
执行以下代码,对比两边stadsdeel的唯一值,直接找出不匹配的根源:
# 查看df1的区域唯一值 print("df1中的区域值:", df1['stadsdeel'].unique()) # 查看df2的区域唯一值 print("df2中的区域值:", df2['stadsdeel'].unique())
常见的差异类型:
- df1用区域编号(如
1、2),df2用区域名称(如Centrum、West) - 大小写不一致(如
centrumvsCentrum) - 拼写/格式差异(如
Zuid-OostvsZuidoost)
2. 统一stadsdeel字段取值
根据第一步的对比结果,通过映射或格式转换统一两边的取值:
示例1:编号与名称映射
如果df1用编号、df2用名称,创建映射字典转换df2的取值:
# 请根据实际数据调整映射关系 district_map = { 'Centrum': '1', 'West': '2', 'Zuid': '3', 'Oost': '4', 'Noord': '5', 'Zuidoost': '6' } df2['stadsdeel'] = df2['stadsdeel'].map(district_map)
示例2:统一大小写
如果是大小写差异,直接统一格式:
df1['stadsdeel'] = df1['stadsdeel'].str.lower() df2['stadsdeel'] = df2['stadsdeel'].str.lower()
3. 重新执行合并
完成字段统一后,再次执行左连接:
df = df1.merge(df2, how='left', on=['stadsdeel', 'year'])
此时2016-2018年的population数据应能正常匹配,2014-2015年的NaN属于预期结果(df2无对应年份数据)。
额外验证(若问题仍存在)
- 检查df2的
drop([0,9])操作是否误删有效数据行 - 验证year字段转换后无异常值:
print("df1异常年份:", df1[~df1['year'].between(2014,2018)]['year'].unique()) print("df2异常年份:", df2[~df2['year'].between(2016,2021)]['year'].unique())
内容的提问来源于stack exchange,提问作者Xin
相关产品推荐
相关产品推荐

