我见过很多关于臭名昭著的SettingWithCopy
警告的问题。我什至敢于回答其中的几个。最近,我正在整理一个涉及该主题的答案,我想展示数据框视图的好处。我未能提供具体的演示来说明为什么创建数据框视图或生成的任何东西是一个好主意SettingWithCopy
考虑df
df = pd.DataFrame([[1, 2], [3, 4]], list('ab'), list('AB'))
df
A B
x 1 2
y 3 4
这dfv
是一个副本df
dfv = df[['A']]
print(dfv.is_copy)
<weakref at 0000000010916E08; to 'DataFrame' at 000000000EBF95C0>
print(bool(dfv.is_copy))
True
我可以生成SettingWithCopy
dfv.iloc[0, 0] = 0
然而,dfv
变了
print(dfv)
A
a 0
b 3
df
没有
print(df)
A B
x 1 2
y 3 4
仍然dfv
是副本
print(bool(dfv.is_copy))
True
如果我改变df
df.iloc[0, 0] = 7
print(df)
A B
x 7 2
y 3 4
但dfv
一直没有改变。但是,我可以df
参考dfv
print(dfv.is_copy())
A B
x 7 2
y 3 4
问题
如果dfv
维护它自己的数据(意思是,它实际上并没有节省内存)并且它通过赋值操作分配值,尽管有警告,那么为什么我们首先要费心保存引用并生成SettingWithCopyWarning
呢?
有什么实实在在的好处?