我喜欢熊猫,并且已经使用它多年并且非常自信我能够很好地处理如何对数据帧进行子集并适当地处理视图与副本(尽管我使用了大量的断言来确定).我也知道有很多关于SettingWithCopyWarning的问题,例如如何处理Pandas中的SettingWithCopyWarning? 以及一些最新的指南,当它发生时缠绕你的头,例如在熊猫中理解SettingWithCopyWarning.
但是我也知道具体的事情,例如这个答案的引用不再出现在最近的文档(0.22.0)中,并且许多事情已经被多年来弃用(导致一些不合适的旧的SO答案),并且事情正在继续改变.
最近,在教导大熊猫完成新手的基本常规Python知识,例如避免链式索引(和使用.iloc/ .loc)之后,我仍然很难提供一般的经验法则来了解何时注意SettingWithCopyWarning(例如何时重要)忽略它是安全的).
我个人发现根据一些规则(例如切片或布尔运算)对数据帧进行子集化的特定模式,然后修改该子集,与原始数据帧无关,是比文档建议的更常见的操作.在这种情况下,我们希望修改副本而不是原始副本,并且警告对新手来说是混乱/可怕的.
我知道提前查看视图与副本的关系
并不容易,例如Pandas用来生成视图与副本的规则是什么?
在Pandas中检查数据框是复制还是查看
因此,我正在寻找一个更普遍(初学者友好)问题的答案:何时对子集化数据帧执行操作会影响创建它的原始数据帧,以及它们何时独立?.
我已经在下面创建了一些我认为合理的案例,但我不确定是否存在"陷阱"我是否缺失或是否有更简单的方法来思考/检查这一点.我希望有人可以证实我对以下用例的直觉是正确的,因为它与我上面的问题有关.
import pandas as pd
df1 = pd.DataFrame({'A':[2,4,6,8,10],'B':[1,3,5,7,9],'C':[10,20,30,40,50]})
Run Code Online (Sandbox Code Playgroud)
1)警告:无
原始更改:否
# df1 will be unaffected because we use .copy() method explicitly
df2 = df1.copy()
#
# Reference: docs
df2.iloc[0,1] = 100
Run Code Online (Sandbox Code Playgroud)
2)警告:是(我真的不明白为什么)
原来改变了:没有
# df1 will be unaffected because .query() always returns a copy
#
# …Run Code Online (Sandbox Code Playgroud)