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

如何为上采样数据添加新索引并保留原索引(解决形状不匹配错误)

解决上采样后X_train转DataFrame的形状不匹配错误

你遇到的这个Shape of passed values is (353, 2698), indices imply (353, 1668)错误,核心原因是创建DataFrame时,传入的数据列数和指定的列名/索引参数长度不匹配,结合你要保留原始索引、给新采样数据加新索引的需求,我给你拆解下解决方案:

第一步:先排查数据列数是否一致

首先得确认上采样后的特征数据列数,和原始X_train的列数是否匹配。执行这两行代码检查:

# 打印上采样后的数据形状
print("上采样后数据形状:", X_resampled.shape)
# 打印原始X_train的形状
print("原始X_train形状:", X_train.shape)

如果输出的列数(第二个数字)不一样,说明你在上采样过程中出错了——比如不小心把标签列y_train混入特征里一起采样,或者做特征变换时误删/新增了列。这时候得回溯上采样代码,确保只对特征列处理,比如用SMOTE的正确姿势是:

from imblearn.over_sampling import SMOTE
sm = SMOTE()
# 只传入特征X_train和标签y_train,返回采样后的特征和标签
X_resampled, y_resampled = sm.fit_resample(X_train, y_train)

第二步:正确转回DataFrame并处理索引

如果列数一致,那问题出在索引/列名的指定上。按下面的步骤操作就能同时保留原始索引、给新采样数据加新索引:

1. 先转回带原始列名的DataFrame

先用原始X_train的列名初始化采样后的DataFrame,避免列数不匹配:

# 提取原始X_train的列名
original_columns = X_train.columns
# 转回DataFrame,指定列名
X_resampled_df = pd.DataFrame(X_resampled, columns=original_columns)

2. 合并原始索引与新采样数据的索引

接下来要给新增的采样行生成专属索引,再和原始索引合并:

# 获取原始索引和采样后的数据行数
original_index = X_train.index
total_rows = X_resampled_df.shape[0]
original_rows = len(original_index)
new_rows_count = total_rows - original_rows

# 生成新索引(根据原始索引类型调整)
if isinstance(original_index[0], int):
    # 如果原始索引是整数,从原始最大索引+1开始递增
    max_original_idx = original_index.max()
    new_indices = range(max_original_idx + 1, max_original_idx + 1 + new_rows_count)
else:
    # 如果原始索引是字符串/其他类型,给新索引加后缀区分
    new_indices = [f"resampled_{i}" for i in range(new_rows_count)]

# 合并原始索引和新索引,设置给DataFrame
combined_indices = list(original_index) + list(new_indices)
X_resampled_df.index = combined_indices

额外避坑提示

  • 别把columns和index参数搞混:如果错误地把原始列名传给了index参数,就会触发列数不匹配的错误,一定要确认参数对应关系。
  • 如果上采样工具把DataFrame转成了numpy数组,转回时务必指定原始列名,不然DataFrame会用默认的0、1、2...作为列名,后续分析容易出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:08:01