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

Pandas Concat拼接后行数异常增加的原因及解决方法

问题原因分析

你遇到的行数异常增加问题,核心原因是两个待拼接的DataFrame索引不匹配。

拆解下你的代码逻辑:

  • real_data是通过pd.DataFrame(scaler.fit_transform(...), columns=real_columns)生成的,这里没有指定index参数,所以它会使用默认的连续整数索引(0,1,2,...,1700644)。
  • 而categorial_data是从原df的子集生成的,它完全继承了原df的索引。如果原df的索引不是连续的唯一整数(比如存在重复索引、非连续的索引值),那么real_data的默认索引和categorial_data的原索引就会出现“不对齐”的情况。

当你执行pd.concat(..., axis=1)时,默认会按索引对齐来合并:它会保留两个DataFrame所有索引的并集,对于某个索引如果只在其中一个DataFrame中存在,就会在另一个DataFrame对应的位置补NaN,最终导致总行数超过原来的1700645行。你看到的train.shape是(1703915,146),说明两个DataFrame的索引集合的并集大小是1703915,比单个DataFrame的行数多了3270行,这正是索引不匹配带来的结果。

解决办法

最简单的修复方式是让real_data继承原df的索引,确保两个DataFrame的索引完全一致,拼接时就不会出现行数膨胀:

修改real_data的生成代码,加上index=df.index参数:

scaler = MinMaxScaler()
real_data = pd.DataFrame(
    scaler.fit_transform(df[real_columns]),
    columns=real_columns,
    index=df.index  # 关键:保留原df的索引,实现索引对齐
)

然后再执行拼接操作:

categorial_data = pd.get_dummies(df[categor_columns], prefix_sep='__')
train = pd.concat([real_data, categorial_data], axis=1, ignore_index=True)
验证方法

你可以先检查两个DataFrame的索引是否完全匹配:

# 验证索引一致性
print(real_data.index.equals(categorial_data.index))

如果输出True,说明索引已经对齐,拼接后的行数就会和原DataFrame保持一致了。

另外,也可以在拼接时显式指定join='inner',只保留两个DataFrame索引的交集,但这种方式可能会丢失部分数据,不如让索引对齐的方式稳妥:

train = pd.concat([real_data, categorial_data], axis=1, join='inner', ignore_index=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:47