Python合并DataFrame后价格列全为NaN的问题排查与解决
解决合并DataFrame后价格列全为NaN的问题
嘿,这种合并后整列NaN的情况我之前也踩过坑,大概率是合并键的匹配环节出了问题,咱们一步步排查解决:
1. 先查合并键的数据类型是否一致
这是最常见的诱因!比如map_df里的邮编是字符串类型(比如"90210"),而价格数据集里的邮编是整数类型(比如90210),两者本质不是同一类数据,自然没法匹配成功。
用这两行代码快速查看类型:
print(map_df['你的邮编列名'].dtype) print(价格数据集['你的邮编列名'].dtype)
如果类型不一致,统一转成字符串(强烈推荐,因为邮编可能带前导零,转整数会丢失关键信息):
map_df['你的邮编列名'] = map_df['你的邮编列名'].astype(str) 价格数据集['你的邮编列名'] = 价格数据集['你的邮编列名'].astype(str)
2. 检查邮编格式是否完全统一
就算类型一样,格式细节差异也会导致匹配失败:
- 有没有前导零差异:
"01001"vs"1001" - 有没有多余空格:
" 90210 "vs"90210" - 有没有后缀差异:比如美国邮编的
"90210-1234"vs"90210"
用这些代码统一格式:
# 去除前后空格 map_df['你的邮编列名'] = map_df['你的邮编列名'].str.strip() 价格数据集['你的邮编列名'] = 价格数据集['你的邮编列名'].str.strip() # 统一保留5位核心邮编(针对带后缀的情况) map_df['你的邮编列名'] = map_df['你的邮编列名'].str[:5] 价格数据集['你的邮编列名'] = 价格数据集['你的邮编列名'].str[:5] # 补上前导零到5位(针对短邮编) map_df['你的邮编列名'] = map_df['你的邮编列名'].str.zfill(5) 价格数据集['你的邮编列名'] = 价格数据集['你的邮编列名'].str.zfill(5)
3. 确认合并时的键名是否对应正确
如果map_df里的邮编列叫zipcode,价格数据集里叫postal_code,合并时没明确指定左右键,也会导致匹配失败。
合并时一定要清晰指定对应列:
merged_df = pd.merge(map_df, 价格数据集, left_on='map_df的邮编列名', right_on='价格数据集的邮编列名', how='left')
这里how='left'是保留map_df的所有行,刚好符合你做分级统计图的需求。
4. 验证两个数据集是否有重叠的邮编
极端情况是两个数据集的邮编完全没有交集,那合并后自然全是NaN。用这个方法快速验证:
common_zips = set(map_df['你的邮编列名']).intersection(set(价格数据集['你的邮编列名'])) print(f"两个数据集共有的邮编数量:{len(common_zips)}") print("示例共有邮编:", list(common_zips)[:5])
如果数量为0,那得检查两个数据源是不是对应同一个区域的邮编了。
把上面的问题排查修复后,再重新执行合并操作,应该就能得到正常的价格列啦!
内容的提问来源于stack exchange,提问作者Raymond Sim
相关产品推荐
相关产品推荐

