You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于同类型变量合并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)
  • 大小写不一致(如centrum vs Centrum)
  • 拼写/格式差异(如Zuid-Oost vs Zuidoost)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:53:19