做一个
.copy(deep=False)
pandas.DataFrame.copy
.
import pandas as pd
df = pd.DataFrame({'x':[1,2,3]})
这会发出警告:
df0 = df[df.x>2]
df0['foo'] = 'bar'
这不会:
df1 = df[df.x>2].copy(deep=False)
df1['foo'] = 'bar'
df0
和
df1
是
DataFrame
对象,但它们的一些不同之处使熊猫能够打印警告。让我们看看是什么。
import inspect
slice= df[df.x>2]
slice_copy = df[df.x>2].copy(deep=False)
inspect.getmembers(slice)
inspect.getmembers(slice_copy)
| | slice | slice_copy |
| _is_copy | weakref | None |
决定是否发出警告的方法是
DataFrame._check_setitem_copy
哪个检查
_is_copy
copy
所以你的数据帧不是
_是副本吗
警告是建议使用
.loc
.loc位置
在一个框架上
_是副本吗
,仍然会收到相同的警告。误导?对。烦人的?当然。有帮助吗?可能,当使用链式赋值时。但是它不能正确地检测到链的分配,并且不加选择地打印警告。