注意:从 pandas 0.24 版本开始,is_copy
已弃用并将在未来版本中删除。虽然私有属性_is_copy
存在,下划线表示该属性不是公共 API 的一部分,因此不应依赖。因此,展望未来,沉默似乎是唯一正确的方法。SettingWithCopyWarning
将在全球范围内这样做:
pd.options.mode.chained_assignment = None
When complete = train.dropna()
被执行,dropna
可能会返回一份副本,所以
出于谨慎考虑,Pandas 设置了complete.is_copy
到一个诚实的
价值:
In [220]: complete.is_copy
Out[220]: <weakref at 0x7f7f0b295b38; to 'DataFrame' at 0x7f7eee6fe668>
这允许 Pandas 稍后警告您,当complete['AgeGt15'] = complete['Age'] > 15
执行后您可能正在修改副本,这不会影响train
。对于初学者来说,这可能是一个有用的警告。就您而言,您似乎无意修改train
间接通过修改complete
。因此,在您的情况下,警告只是毫无意义的烦恼。
您可以通过设置使警告静音,
complete.is_copy = False # deprecated as of version 0.24
这比制作实际副本要快,并且可以减少SettingWithCopyWarning
处于萌芽状态(此时where _check_setitem_copy叫做):
def _check_setitem_copy(self, stacklevel=4, t='setting', force=False):
if force or self.is_copy:
...
如果您确实有信心知道自己在做什么,则可以关闭SettingWithCopyWarning
全球范围内与
pd.options.mode.chained_assignment = None # None|'warn'|'raise'
消除警告的另一种方法是制作一个新副本:
complete = complete.copy()
但是,如果 DataFrame 很大,您可能不想这样做,因为复制
可能需要大量的时间和内存,而且它是
完全没有意义(除了为了压制warning) 如果你知道的话complete
已经是副本了。