【发布时间】:2017-01-20 05:15:09
【问题描述】:
我看到很多关于臭名昭著的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 没有改变。但是,我可以从dfv 引用df
print(dfv.is_copy())
A B
x 7 2
y 3 4
问题
如果dfv 维护它自己的数据(意思是,它实际上并没有节省内存)并且尽管有警告,它仍然通过赋值操作分配值,那么我们为什么还要费心保存引用并生成SettingWithCopyWarning ?
什么是有形的好处?
【问题讨论】:
-
有趣的是
print(dfv._is_view)在查看后打印False并在iloc分配后更改为True,这是违反直觉的,并且是 IMO 的错误
标签: python pandas chained-assignment