首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫chained_assignment警告异常处理

熊猫chained_assignment警告异常处理
EN

Stack Overflow用户
提问于 2017-11-08 14:23:11
回答 1查看 20.9K关注 0票数 9

如果您在python中与熊猫一起工作,那么您在处理数据片段时已经知道了chained_assignment警告(例如,描述了这里)。

我找到了可以设置为pandas.options.mode.chained_assignment的选项

  • None,忽略警告
  • "warn",打印警告消息
  • "raise",引发异常

文档的比较

我包含了一个最小的示例,在try..except..else块中触发此警告以进行异常处理。我希望只有在设置pandas.options.mode.chained_assignment = "raise"时才会触发异常,如下面的示例3所示。

在这个最小的示例中,行为与预期相同,因此使用pandas.options.mode.chained_assignment = "warn"的示例2只会导致打印警告消息,但不会引发任何异常。

然而,在更大的框架中,我看到一个异常正在引发,即使参数被设置为pandas.options.mode.chained_assignment = "warn",在最小示例(参见示例4)之前使用打印进行检查(参见示例4)

还有其他的熊猫参数影响这个警告信息的异常引发行为吗?

下面是一个最小的代码示例,设置/打印pd.options.mode.chained_assignment参数,并显示try..catch..except块中的行为。

代码语言:javascript
复制
import pandas as pd

# set the chained_assignment option
pd.options.mode.chained_assignment = "raise" # raises exception in case of warning
pd.options.mode.chained_assignment = "warn"  # prints warning in case of warning, no exception is raised
pd.options.mode.chained_assignment = None    # no warning message and no exception is raised

print "pd.options.mode.chained_assignment :", pd.options.mode.chained_assignment

# create a default pandas dataframe with two columns A,B
df = pd.DataFrame({"A" : [0, 1, 2], "B" : [3, 4, 5]})

print df

# exctract a slice of the given pandas dataframe
df2 = df[df["A"] > 0]

# exception handling
try :
    # try to modify the slice, triggering the pandas warning
    df2["C"] = 2
except :
    print "EXCEPTION RAISED"
else :
    print "NO EXCEPTION"

print df2

示例1设置pd.options.mode.chained_assignment = None将产生以下输出(没有警告,也没有例外)

代码语言:javascript
复制
pd.options.mode.chained_assignment : None
   A  B
0  0  3
1  1  4
2  2  5
NO EXCEPTION
   A  B  C
1  1  4  2
2  2  5  2

示例2设置pd.options.mode.chained_assignment = "warn"将产生以下输出(打印警告,但没有例外)

代码语言:javascript
复制
pd.options.mode.chained_assignment : warn
   A  B
0  0  3
1  1  4
2  2  5
NO EXCEPTION
C:\Users\my.name\my\directory\test.py:14: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

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  df2["C"] = 2
   A  B  C
1  1  4  2
2  2  5  2

示例3设置pd.options.mode.chained_assignment = "raise"将导致以下输出(引发异常)

代码语言:javascript
复制
pd.options.mode.chained_assignment : raise
A  B
0  0  3
1  1  4
2  2  5
EXCEPTION RAISED
   A  B  C
1  1  4  2
2  2  5  2

示例4:这就是我在一个具有完全相同测试代码的大框架中所看到的。我没有明确地设置链接的pd.options.mode.chained_assignment参数,但是我看到它被设置为"warn",即使引发了异常

代码语言:javascript
复制
pd.options.mode.chained_assignment warn
   A  B
0  0  3
1  1  4
2  2  5
EXCEPTION RAISED
   A  B  C
1  1  4  2
2  2  5  2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-08 15:51:13

经过长时间的搜寻,“坏人”被找到了。另一个开发人员在他的模块中包含了以下几行

代码语言:javascript
复制
import warnings
warnings.filterwarnings('error')

这会将警告转化为例外。有关详细信息,请参阅警告包文档

因此,我的警告被视为例外,尽管熊猫选项被设置为“警告”。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47182183

复制
相关文章

相似问题

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