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

合并两个DataFrame时公共列category出现NaN的问题排查

问题:合并两个DataFrame指定列时出现NaN和重复列

我有两个DataFrame:household(df1)和market(df2),想要提取两者的longitude、latitude、category列合并成新的df3。但用append、merge、concat操作后,df1的category列全是NaN,concat还生成了重复列,求问哪里错了?

数据示例

household(df1)数据:

,hhinc8,owncar,longitude,latitude,category,salary
0,5.0,1.0,-82.99194508,40.04649963,LRLC,34
1,6.0,2.0,-82.99584706,40.03738548,LRHC,23
...

market(df2)数据:

longitude,latitude,category,FSA
-83.0347849999999,39.945993,SPM,81
-82.957851,40.060118,SPM,93
...

预期df3格式:

longitude,latitude,category
-82.99194508,40.04649963,LRLC
-82.99584706,40.03738548,LRHC
-83.0347849999999,39.945993,SPM
...

尝试的操作及问题

  • append方法
df = household[['longitude','latitude','category']].append(market[['longitude','latitude','category']].reset_index(drop=True))
print(df)

结果:df1的category列全为NaN。

  • merge方法
df = household[['longitude','latitude','category']].reset_index(drop=True).merge(market[['longitude','latitude','category']].reset_index(drop=True),on="category",how="left")
print(df)

结果:category列全为NaN,且生成多列。

  • concat方法
df = pd.concat([household[['longitude','latitude','category']].reset_index(drop=True),market[['longitude','latitude','category']].reset_index(drop=True)],axis=0)
print(df)

结果:出现重复的longitude、latitude、category列,df1的category列全为NaN。

错误原因

  1. 列名不匹配:核心问题是household的category列名和你代码中写的不一致——比如可能存在空格、大小写差异(如Category),或者导入数据时列名被自动修改。此时你提取的category实际是空列,合并后自然显示NaN;如果两个DataFrame的目标列名不完全一致,concat会把它们当成不同列,导致重复列。
  2. merge方法用错场景:merge是用于关联匹配(类似SQL的join),而你需要的是上下拼接行,完全不符合merge的使用场景,所以结果必然错误。

正确解法

第一步:确认列名一致性

先打印两个DataFrame的列名,确保目标列名完全相同:

print("household列名:", household.columns.tolist())
print("market列名:", market.columns.tolist())

如果发现household的category列名有差异(比如带空格),就用正确的列名进行提取。

第二步:用concat正确拼接

确认列名一致后,使用concat进行行拼接(axis=0),可选重置索引:

# 提取指定列
df_hh = household[['longitude', 'latitude', 'category']]
df_mkt = market[['longitude', 'latitude', 'category']]

# 拼接并重置索引(ignore_index=True会生成连续的新索引)
df3 = pd.concat([df_hh, df_mkt], axis=0, ignore_index=True)

print(df3)

补充:append方法(已过时)

如果一定要使用append,同样需保证列名一致,注意append在pandas 2.0及以上版本已被弃用:

df3 = df_hh.append(df_mkt, ignore_index=True)

内容的提问来源于stack exchange,提问作者Tallion 22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:45:39