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

数据拼接异常求助:RobustScaler后出现NaN与形状错误

问题根源与解决方案

问题原因

你遇到的形状异常、分类列NaN问题,核心是两个操作失误:

  1. 创建缩放后数值DataFrame时,columns=[numeric_columns]的写法错误——numeric_columns本身就是列名列表,加外层列表会让列名变成嵌套结构,同时生成的DataFrame使用默认连续索引,和原训练集/测试集的子集索引不匹配;
  2. 拼接时索引无法对齐,pandas会自动补全缺失索引的行,导致行数膨胀、分类列出现大量NaN。

修正方案(两种可选)

方案1:修正DataFrame创建与拼接逻辑

先确保缩放后的数值DataFrame列名、索引和原数据集一致,再进行拼接:

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import RobustScaler
import pandas as pd

# 1. 划分数据集(原代码不变)
X_train,X_test,y_train,y_test= train_test_split(X,y,test_size=0.2,random_state=42)

# 2. Robust缩放数值列
robust = RobustScaler()
X_train_ = robust.fit_transform(X_train[numeric_columns])
X_test_ = robust.transform(X_test[numeric_columns])

# 关键修正:直接用numeric_columns作为列名,同时指定索引为原数据集的索引
X_train_sc_num = pd.DataFrame(X_train_, columns=numeric_columns, index=X_train.index)
X_test_sc_num = pd.DataFrame(X_test_, columns=numeric_columns, index=X_test.index)

# 3. 拼接缩放数值列与原分类列(含独热编码列)
X_train_scaled = pd.concat([X_train_sc_num, X_train[categoric_columns]], axis=1)
X_test_scaled = pd.concat([X_test_sc_num, X_test[categoric_columns]], axis=1)

方案2:直接替换原DataFrame的数值列(更简洁)

无需单独创建DataFrame,直接在原数据集副本上替换缩放后的数值列,分类列完全保留原样:

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import RobustScaler
import pandas as pd

# 1. 划分数据集
X_train,X_test,y_train,y_test= train_test_split(X,y,test_size=0.2,random_state=42)

# 2. 复制原数据集,避免修改原始数据
X_train_scaled = X_train.copy()
X_test_scaled = X_test.copy()

# 3. 对数值列进行缩放并替换,分类列(含独热编码)保持不变
robust = RobustScaler()
X_train_scaled[numeric_columns] = robust.fit_transform(X_train_scaled[numeric_columns])
X_test_scaled[numeric_columns] = robust.transform(X_test_scaled[numeric_columns])

效果验证

执行上述任一方案后,X_train_scaled的形状会是(466,28),分类列不会出现NaN,且独热编码列完全保留原始状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:37:12