【问题标题】:pandas chained_assignment warning exception handlingpandas chained_assignment 警告异常处理
【发布时间】:2018-04-21 06:52:21
【问题描述】:

如果您在 python 中使用 pandas,您已经知道在处理数据帧切片时会出现 chained_assignment 警告(如 here 中所述)。

我找到了pandas.options.mode.chained_assignment这个选项,可以设置成

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

documentation比较

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

在这个最小示例中,行为符合预期,因此示例 2 与 pandas.options.mode.chained_assignment = "warn" 只会打印警告消息,但不会引发异常。

但是在更大的框架中,即使参数设置为 pandas.options.mode.chained_assignment = "warn",我也看到引发异常,之前使用打印检查,就像在最小示例中一样(参见示例 4)

是否有任何其他 pandas 参数会影响此警告消息的异常引发行为?


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

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 会产生以下输出(无警告,无异常)

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" 会产生以下输出(打印警告,但无异常)

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" 会产生以下输出(引发异常)

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",即使引发了异常

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

【问题讨论】:

    标签: python pandas exception-handling


    【解决方案1】:

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

    import warnings
    warnings.filterwarnings('error')
    

    这会将警告变成异常。更多详情见warnings package documentation

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2018-03-23
      • 2021-09-30
      • 2018-11-10
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多