pandas中.ix()调用替换为.loc()或.iloc()的正确实现方法
关于废弃.ix方法的正确替换实现
首先直接明确结论:你提出的“赋值左侧换iloc、传入transform的右侧换loc”的替换思路没有任何匹配pandas设计逻辑的依据——这种写法在当前全选的场景下虽然能碰巧运行成功,但本质是认知偏差带来的错误判断。
核心认知纠正
很多人混淆.loc和.iloc的选择规则,本质是误以为这两个索引器的选择和“代码在赋值等号的左边还是右边”有关,实际上两者的选择逻辑只和你取数的匹配规则有关:
.loc是纯标签索引:按行、列的名称做匹配,如果你要取的内容是靠列名、行名定位的,不管这段代码在赋值左侧还是右侧,都应该用.loc,超出标签范围会抛出KeyError.iloc是纯位置索引:按行、列从0开始的序号位置做匹配,如果你要取的内容是靠“第几行、第几列”的位置定位的,不管这段代码在赋值左侧还是右侧,都应该用.iloc,超出位置范围会抛出IndexError
你原代码里的.ix[:, :]本意是取所有行、所有列的全表内容,这种全选场景下,.loc[:, :]和.iloc[:, :]拿到的DataFrame内容完全没有差异,根本不存在“某一侧必须用某一种索引器”的强制要求。
当前场景的规范实现
针对你这个全表做标准化替换的场景,有三种完全合规、无歧义的常用写法:
- 全链路用位置索引实现,和原.ix的全选行为完全对齐:
test_df.iloc[:, :] = scaler.transform(test_df.iloc[:, :]) - 全链路用标签索引实现,最终运行效果和上面的写法没有任何区别:
test_df.loc[:, :] = scaler.transform(test_df.loc[:, :]) - 日常开发中最简洁的原地全表替换写法,不需要额外写索引切片:
test_df[:] = scaler.transform(test_df)
扩展场景的选择参考
如果后续你的操作不再是全表选择,而是定位特定行/列做处理,严格按索引匹配规则选对应方法即可,不需要刻意区分赋值左右侧:
- 要对列名为
["height", "weight"]的列做标准化,统一用标签索引:test_df.loc[:, ["height", "weight"]] = scaler.transform(test_df.loc[:, ["height", "weight"]]) - 要对位置上第3到第5列(对应切片位置2:5)做标准化,统一用位置索引:
test_df.iloc[:, 2:5] = scaler.transform(test_df.iloc[:, 2:5])
内容的提问来源于stack exchange,提问作者Joquim
相关产品推荐
相关产品推荐

