合并两个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。
错误原因
- 列名不匹配:核心问题是
household的category列名和你代码中写的不一致——比如可能存在空格、大小写差异(如Category),或者导入数据时列名被自动修改。此时你提取的category实际是空列,合并后自然显示NaN;如果两个DataFrame的目标列名不完全一致,concat会把它们当成不同列,导致重复列。 - 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
相关产品推荐
相关产品推荐

