首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理SettingWithCopyWarning:

如何处理SettingWithCopyWarning:
EN

Stack Overflow用户
提问于 2018-04-07 12:57:31
回答 2查看 180关注 0票数 1

我正在使用ipython3 notebook并运行以下命令:

代码语言:javascript
运行
复制
separ['RT'] = separ['text'].str.contains(r"^(?=.*\bRT\b\s@\b).*$", 
case=False) == True

我得到的警告如下:

代码语言:javascript
运行
复制
-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

我不知道这是什么意思,也不知道该如何处理。

EN

回答 2

Stack Overflow用户

发布于 2018-04-07 13:33:58

这种类型的错误通常表示Pandas已经创建了dataframe子集的轻量级副本,然后您可以尝试在适当的位置对其进行修改。

例如,假设您有一个dataframe,它的列是整数1..10,并创建了一组偶数行:

代码语言:javascript
运行
复制
df = pandas.DataFrame({ 'int': range(10),
                        'label': [ 'x'+str(i) for i in range(10) ] })
sub = df[(df.int % 2) == 0]

dataframe sub现在包含:

代码语言:javascript
运行
复制
0    x0
2    x2
4    x4
6    x6
8    x8
Name: label, dtype: object

但是,sub实际上只是原始数据帧df的内存占用情况的视图。如果我们现在尝试修改sub

代码语言:javascript
运行
复制
sub.label = [ 'y' + str(j) for j in range(5) ]

我们得到了您已经看到的错误消息:

代码语言:javascript
运行
复制
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()方法:

代码语言:javascript
运行
复制
newsub = df[(df.int % 2) == 0].copy()
newsub.label = [ 'y' + str(j) for j in range(5) ]
票数 0
EN

Stack Overflow用户

发布于 2018-04-07 13:34:07

问题出在过滤上:

代码语言:javascript
运行
复制
separ = tweets[tweets['TradeWar'] == True] 

什么与以下内容相同:

代码语言:javascript
运行
复制
separ = tweets[tweets['TradeWar']]

并且需要copy

代码语言:javascript
运行
复制
separ = tweets[tweets['TradeWar']].copy()

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

同样,代码也应该简化:

代码语言:javascript
运行
复制
separ['RT'] = separ['text'].str.contains(r"^(?=.*\bRT\b\s@\b).*$", case=False) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49704000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档