如果您使用pandas在python中工作,那么在处理数据帧切片时您已经知道了chained_assignment警告(例如描述为here)。
我找到了可以设置为
的选项pandas.options.mode.chained_assignment
None
,忽略警告"warn"
,打印警告信息"raise"
,提出异常我包含了一个最小的示例,在try..except..else
块中触发此警告以进行异常处理。我希望只有设置pandas.options.mode.chained_assignment = "raise"
才会触发异常,如下面的示例3所示。
在这个最小的例子中,行为是预期的,所以示例2,with
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
答案 0 :(得分:2)
经过长时间的搜索,"坏人"被找到。 另一位开发人员在他的模块中包含以下几行
import warnings
warnings.filterwarnings('error')
这会将警告变为异常。有关详细信息,请参阅warnings package documentation
因此我的警告被视为例外,尽管pandas选项设置为"警告"