数据拼接异常求助:RobustScaler后出现NaN与形状错误
问题根源与解决方案
问题原因
你遇到的形状异常、分类列NaN问题,核心是两个操作失误:
- 创建缩放后数值DataFrame时,
columns=[numeric_columns]的写法错误——numeric_columns本身就是列名列表,加外层列表会让列名变成嵌套结构,同时生成的DataFrame使用默认连续索引,和原训练集/测试集的子集索引不匹配; - 拼接时索引无法对齐,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
相关产品推荐
相关产品推荐

