使用.iloc给DataFrame赋值触发SettingWithCopyWarning如何解决?
警告出现的原因
你用到了链式索引操作:pamap2_df["heartrate"].iloc[0:4] = 100 是分两步完成索引的,第一步先取heartrate列,第二步再对返回的结果取前4行赋值。pandas在取单列的步骤中,无法保证返回的是原DataFrame的视图还是独立副本,如果返回的是副本,你的赋值操作只会修改副本,不会作用到原pamap2_df上,和你的预期不符。哪怕你这次运行实际修改成功了,这种操作模式依然存在潜在失效风险,所以pandas会抛出SettingWithCopyWarning提醒你注意该问题。
避免警告的解决方案
- 方案1:使用pandas推荐的一次性索引写法,拆分链式操作
如果你要按位置取前4行修改heartrate列,可以用iloc合并列定位:
如果你使用的是默认整数行索引,也可以用pamap2_df.iloc[0:4, pamap2_df.columns.get_loc("heartrate")] = 100loc写法:pamap2_df.loc[0:3, "heartrate"] = 100 - 方案2:如果
pamap2_df本身是你从其他DataFrame中筛选出来的切片,生成它的时候主动调用.copy()声明是独立副本:# 假设你是通过筛选得到的pamap2_df,末尾加.copy() pamap2_df = other_df[筛选条件].copy() # 后续再执行赋值操作就不会触发警告 pamap2_df["heartrate"].iloc[0:4]=100 - 方案3:确认当前操作符合预期的前提下,主动关闭该类警告
import pandas as pd pd.set_option('mode.chained_assignment', None)
内容的提问来源于stack exchange,提问作者NMA
相关产品推荐
相关产品推荐

