我正在使用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
我不知道什么是手段以及如何处理这个问题。
答案 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