如何在Pandas中裁剪指定列列表且不触发SettingWithCopyWarning?
解决Pandas SettingWithCopyWarning的列裁剪问题
嘿,我太懂你碰到这个警告的烦躁了!这个问题本质上是因为你操作的pandas_df大概率不是一个独立的DataFrame,而是另一个大DataFrame的视图/切片副本——Pandas拿不准你到底想修改原始数据还是这个副本,所以抛出警告来提醒你。
先确认问题根源
你可以先检查一下pandas_df是不是视图:
print(pandas_df._is_copy)
如果输出是类似<weakref at 0x...; to 'DataFrame' at 0x...>的内容,那实锤了,它就是某个父DataFrame的视图,不是独立的对象。
靠谱的解决方案
方法1:先转成独立DataFrame(最简单直接)
先把pandas_df复制一份,变成完全独立的对象,之后再用loc执行裁剪操作,警告就会消失:
# 先复制出独立的DataFrame pandas_df = pandas_df.copy() # 再用loc定位列执行裁剪 pandas_df.loc[:, action_cols] = pandas_df.loc[:, action_cols].clip(lower=0, upper=clip_upper)
方法2:用assign创建新DataFrame(函数式风格)
如果你不想修改原DataFrame,而是生成一个新的处理后的版本,assign方法是个好选择,它完全不会触发警告:
pandas_df = pandas_df.assign(**{ col: pandas_df[col].clip(lower=0, upper=clip_upper) for col in action_cols })
这个写法是遍历action_cols里的每一列,对每一列执行裁剪,然后把结果赋值回原列名,最终返回新的DataFrame。
为啥之前用loc没用?
因为哪怕用loc,如果pandas_df本身是视图,Pandas依然不确定你要修改的是视图还是原始数据,所以警告还会出现。核心是要先让pandas_df变成独立的对象才行。
内容的提问来源于stack exchange,提问作者Zak Keirn
相关产品推荐
相关产品推荐

