Python pandas新列赋值问题:iloc链式赋值失效loc可正常运行
两种赋值写法的差异与iloc链式赋值失效原因
核心失效原因
你写的df.iloc[x]['Status'] = 'New'属于链式索引操作,是pandas中最常见的赋值失效场景。
pandas对df.iloc[x]这类行切片操作的返回值没有固定承诺,根据数据存储类型、内存占用情况,可能返回原DataFrame的视图,也可能返回独立的副本。当返回的是副本时,你后续['Status'] = 'New'的赋值操作仅作用在这个临时生成的副本上,不会回写到原始DataFrame,多数情况下pandas还会弹出SettingWithCopyWarning警告提示该风险。
两种写法的具体差异
- 操作逻辑差异
- 链式iloc写法:操作分为两步,第一步
df.iloc[x]生成临时的行Series对象,第二步对该临时对象赋值,修改不会同步到原DataFrame。 - 官方推荐的loc写法:
df.loc[df['Last Odometer Reading']<100, 'Status'] = 'New'是一次性完成行过滤、列定位两个动作,直接操作原始DataFrame的对应内存地址,赋值会直接写入原对象,不存在中间临时对象的问题。
- 链式iloc写法:操作分为两步,第一步
- 性能差异
- 逐行for循环+iloc的写法属于Python级别的迭代操作,数据量超过一万行时性能会大幅下降。
- loc向量化赋值是pandas底层用C实现的批量处理逻辑,效率远高于手动循环,代码也更简洁。
拓展:如果一定要用iloc实现逐行赋值怎么写
要避免链式索引,把列定位也合并到iloc的参数中,一次性完成定位即可正常赋值:
# df.columns.get_loc('Status') 用于获取Status列对应的整数位置 df.iloc[x, df.columns.get_loc('Status')] = 'New'
内容的提问来源于stack exchange,提问作者at_514
相关产品推荐
相关产品推荐

