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

Pandas concat(axis=1)行数异常咨询:行数相同拼接后行数不符

为什么pd.concat按列拼接后行数不符合预期?

这个问题我之前也碰到过,核心原因其实是Pandas的concat按列拼接时的索引对齐逻辑在搞鬼!

根本原因

当你执行pd.concat([df1, df2], axis=1)时,Pandas默认会按照两个DataFrame的索引(index)进行外连接(outer join):

  • 它会保留所有出现在任意一个DataFrame索引里的行
  • 如果某个索引只在其中一个DataFrame存在,另一个DataFrame对应位置的列会填充NaN
  • 最终的行数是两个DataFrame索引的并集的大小,这就是为什么你的行数从16363变成了23006——说明两个DataFrame的索引有不少重复或者不重叠的部分。

举个简单的小例子:
假设df1的索引是[0,1,2,2](有重复索引),df2的索引是[0,1,3](有df1没有的索引),按列拼接后,最终的索引会是[0,1,2,2,3],行数就变成了5,比原来的4和3都多。

如何验证问题?

你可以通过以下代码检查两个DataFrame的索引情况:

  1. 检查索引是否完全一致(包括顺序和值):
    print(df1.index.equals(df2.index))
    
  2. 检查索引是否有重复值:
    print("df1索引是否唯一:", df1.index.is_unique)
    print("df2索引是否唯一:", df2.index.is_unique)
    
  3. 找出两个索引的差异部分:
    diff_index = set(df1.index).symmetric_difference(set(df2.index))
    print("索引差异的数量:", len(diff_index))
    

解决办法

根据你的需求,有几种处理方式:

  • 忽略索引,直接按行位置拼接:如果你的两个DataFrame本来就是按行顺序一一对应的,只是索引乱了,那么可以用ignore_index=True参数跳过索引对齐:
    df = pd.concat([df1, df2], axis=1, ignore_index=True)
    
  • 先统一索引再拼接:重置两个DataFrame的索引,让它们从0开始连续编号:
    df1 = df1.reset_index(drop=True)
    df2 = df2.reset_index(drop=True)
    df = pd.concat([df1, df2], axis=1)
    
  • 只保留两个索引都存在的行:如果只想保留同时出现在两个DataFrame里的索引对应的行,用join='inner'参数做内连接:
    df = pd.concat([df1, df2], axis=1, join='inner')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:47:50