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

索引未对齐的Pandas DataFrames拼接异常问题排查

嘿,这个问题我之前也碰到过!核心原因就是Pandas的concat(axis=1)是按索引对齐数据的,不是单纯按行位置拼接,咱们一步步拆解:

第一个问题:为什么测试集拼接后行数变成24330?

你看,svd_col[len(X_train):]的切片保留了它原来的索引——也就是从225609到237773(共12165行),而X_test = test[['id']]的索引是默认的0到12164。当你横向拼接时,Pandas会把两个DataFrame的索引做并集:左边X_test的0-12164行,右边svd切片的225609-237773行,没有任何重叠的索引,所以最终行数是12165+12165=24330,每一行在另一个DataFrame里对应的位置都是NaN。

而训练集拼接正常,是因为svd_col[0:len(X_train)]的索引0-225608,和X_train的索引完全匹配,所以对齐后行数不变。

第二个问题:reset_index()后为什么变成34列?

reset_index()默认会把原来的索引作为新列index保留下来,所以你拼接的是1列的X_test + 32列的svd数据 + 1列的原索引,总共34列。而且如果直接删这个列,可能会因为索引对齐的问题麻烦,所以得用drop=True参数丢弃原索引。

正确的解决方法

方法一:只重置切片部分的索引并丢弃原索引

X_test = test[['id']]
print(X_test.shape)
# 关键:reset_index(drop=True) 重置索引为0开始,同时不保留原索引列
svd_test_segment = svd_col[len(X_train):].reset_index(drop=True)
print(svd_test_segment.shape)
X_test = pd.concat([X_test, svd_test_segment], axis=1)
print('X_test', X_test.shape)

执行后应该会输出(12165, 33),完美符合预期。

方法二:提前重置整个svd_col的索引(更省心)

如果原svd_col的索引对你没用,直接全局重置,后续切片就不会有索引对齐问题:

# 先重置svd_col的索引,丢弃原索引
svd_col = svd_col.reset_index(drop=True)

# 训练集拼接
X_train = pd.concat([train[['id', 'target']], svd_col[:len(train)]], axis=1)
# 测试集拼接
X_test = pd.concat([test[['id']], svd_col[len(train):]], axis=1)

print('X_train shape:', X_train.shape)  # (225609, 34)
print('X_test shape:', X_test.shape)    # (12165, 33)

这样不管训练还是测试集,索引都是连续的0开始整数,拼接时完全按位置对齐,不会出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:42:47