如何处理SettingWithCopyWarning:

时间:2018-04-07 04:57:31

标签: string pandas

我正在使用ipython3笔记本并运行以下命令:

separ['RT'] = separ['text'].str.contains(r"^(?=.*\bRT\b\s@\b).*$", 
case=False) == True

我得到的警告如下:

-c:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我不知道什么是手段以及如何处理这个问题。

2 个答案:

答案 0 :(得分:0)

这种类型的错误通常表明Pandas已经创建了数据框子集的轻量级副本,然后您可以尝试对其进行修改。

例如,假设您有一个数据框,其中包含整数1..10的列,并创建了一系列偶数行:

MySQLdb

数据框df = pandas.DataFrame({ 'int': range(10), 'label': [ 'x'+str(i) for i in range(10) ] }) sub = df[(df.int % 2) == 0] 现在包含:

sub

但是,0 x0 2 x2 4 x4 6 x6 8 x8 Name: label, dtype: object 实际上只是查看原始数据帧sub的内存占用量。如果我们现在尝试修改df

sub

我们收到您发现的错误消息:

sub.label = [ 'y' + str(j) for j in range(5) ]

如果您想避免这种情况,可能需要使用A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead 方法:

.copy()

答案 1 :(得分:0)

问题在于过滤:

newsub = df[(df.int % 2) == 0].copy()
newsub.label = [ 'y' + str(j) for j in range(5) ]

与...相同:

separ = tweets[tweets['TradeWar'] == True] 

需要copy

separ = tweets[tweets['TradeWar']]

如果稍后修改separ = tweets[tweets['TradeWar']].copy() 中的值,您会发现修改不会传播回原始数据(separ),并且Pandas会发出警告。

同样代码也应该简化:

tweets