为何修改DataFrame指定的前200列后全部2000列都受影响
问题复现
尝试仅对总列数为2000的DataFrame的前200列应用修改操作,选中的行列范围无误,修改本身运行正常,但将修改结果赋值回原DataFrame时,全部2000列都受到了影响,所用代码如下:
df.iloc[:, 0:200] = scaler.transform(df.iloc[:, 0:200])
问题原因
- 最常见原因是
scaler拟合(fit)时传入了全部2000列的数据,导致transform输出的数组形状为(行数, 2000),pandas赋值时触发广播机制,错误覆盖全列 - 少数情况是旧版本pandas(1.0版本以下)的iloc切片赋值存在广播bug,当右侧为numpy数组时会错误扩散到全部列
- 极少数情况是右侧返回的结果被意外降维为一维数组,赋值时pandas按行广播覆盖全列
解决方法
- 第一步先校验转换结果的形状,确认符合预期:
print(scaler.transform(df.iloc[:, 0:200]).shape)
正常输出应为(你的数据集行数, 200) - 如果输出形状为2000列,修正scaler的拟合逻辑,仅用前200列拟合即可:
scaler.fit(df.iloc[:, 0:200]) - 如果形状无误仍触发全列修改,改用列名显式赋值替代iloc赋值,兼容性更强:
modify_cols = df.columns[:200] df[modify_cols] = scaler.transform(df[modify_cols]) - 也可以将转换结果转为DataFrame后再赋值,彻底避免广播异常:
df.iloc[:, :200] = pd.DataFrame( scaler.transform(df.iloc[:, :200]), columns=df.columns[:200], index=df.index ) - 若为pandas版本过旧导致的原生bug,升级到最新稳定版即可修复:
pip install --upgrade pandas
内容的提问来源于stack exchange,提问作者Jonathan Roy
相关产品推荐
相关产品推荐

