为何使用.loc仍触发pandas的SettingWithCopyWarning?
为什么用了.loc[,]仍触发SettingWithCopyWarning?
问题根源
你写的sub_df = df.loc[df.A > 1]这一步,虽然用了.loc,但返回的sub_df可能是原DataFrame的视图(而非独立副本)。pandas无法明确判定这个切片到底是视图还是副本,当你后续通过sub_df.loc[:, 'C']修改列时,它会触发警告——因为担心你是在无意中修改原数据的视图,而非独立的子数据集。
解决方法
方法1:显式创建副本
在赋值sub_df时加上.copy(),直接生成独立的DataFrame,彻底切断和原数据的关联:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) sub_df = df.loc[df.A > 1].copy() # 显式创建副本 sub_df.loc[:, 'C'] = sub_df.A + sub_df.B
方法2:直接在原DataFrame上链式修改
跳过中间变量sub_df,直接在原DataFrame上完成列的赋值操作:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) df.loc[df.A > 1, 'C'] = df.loc[df.A > 1, 'A'] + df.loc[df.A > 1, 'B']
补充说明
pandas的切片返回视图还是副本,取决于底层数据的存储布局和切片逻辑,有时候即使使用.loc也无法确保返回独立副本。显式调用.copy()是最稳妥的消除这类警告的方式,能明确告诉pandas你要操作的是一个全新的数据集。
内容的提问来源于stack exchange,提问作者Jiexing Wu
相关产品推荐
相关产品推荐

