pandas在train_test_split之后显示了SettingWithCopyWarning

时间:2017-07-13 20:49:07

标签: python pandas scikit-learn

我正在尝试操作从Sci-Kit Learn的 train_test_split 操作中收到的数据帧。系统给了我以下内容:

  

/usr/local/lib/python3.6/site-packages/pandas/core/indexing.py:179:   SettingWithCopyWarning:尝试在a的副本上设置值   来自DataFrame的切片

以下内容引发了我的系统警告:

import pandas as pd
from sklearn.model_selection import train_test_split
X=pd.DataFrame({'A':[2,5,7,8,9],'B':[2,5,3,51,5]})
(Xt,Xv)=train_test_split(X)
Xt.iloc[0,0]=6

我使用以下版本:

python:'3.6.1(默认,2017年6月26日,19:29:26)\ n [GCC 4.9.2]'

pandas:0.20.3

sklearn:0.18.2

3 个答案:

答案 0 :(得分:4)

您可以按如下方式解决问题:

In [16]: Xt = Xt.copy()

In [17]: Xt.iloc[0,0]=6

In [18]: Xt
Out[18]:
   A  B
0  6  2
2  7  3
1  5  5

In [19]: X
Out[19]:
   A   B
0  2   2     # <--- NOTE: the value in the original DF has NOT been changed
1  5   5
2  7   3
3  8  51
4  9   5

或者您可以使用numpy.split(...) method

答案 1 :(得分:3)

另一种选择是重置is_copy flat,但这似乎是train_test_split函数的错误。

Xt.is_copy=None

答案 2 :(得分:1)

熊猫一般会过于激烈地吐出这个警告,你可以在这里看到一个很好的讨论: How to deal with SettingWithCopyWarning in Pandas?

但如果我确信我的代码按预期工作,我只需使用:

pd.options.mode.chained_assignment = None

位于我的文件顶部。你总是可以告诉你是否没有更新你的df,因为你认为你所做的一切都不会在那里。