我正在使用ipython3 notebook并运行以下命令:
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我不知道这是什么意思,也不知道该如何处理。
发布于 2018-04-07 13:33:58
这种类型的错误通常表示Pandas已经创建了dataframe子集的轻量级副本,然后您可以尝试在适当的位置对其进行修改。
例如,假设您有一个dataframe,它的列是整数1..10,并创建了一组偶数行:
df = pandas.DataFrame({ 'int': range(10),
'label': [ 'x'+str(i) for i in range(10) ] })
sub = df[(df.int % 2) == 0]dataframe 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()方法:
newsub = df[(df.int % 2) == 0].copy()
newsub.label = [ 'y' + str(j) for j in range(5) ]发布于 2018-04-07 13:34:07
问题出在过滤上:
separ = tweets[tweets['TradeWar'] == True] 什么与以下内容相同:
separ = tweets[tweets['TradeWar']]并且需要copy
separ = tweets[tweets['TradeWar']].copy()如果您稍后修改separ中的值,您会发现修改不会传播回原始数据(tweets),并且Pandas会发出警告。
同样,代码也应该简化:
separ['RT'] = separ['text'].str.contains(r"^(?=.*\bRT\b\s@\b).*$", case=False) https://stackoverflow.com/questions/49704000
复制相似问题