Panda 的 pd.where 函数在可为空条件下的行为

Tai*_*de 5 python series dataframe pandas

当使用 Pandas 的Series.where函数时,我遇到了以下行为:似乎应用可Series.where为空条件的结果取决于参数的值inplace

比较以下两个代码片段:

s = pd.Series(range(6))
cond = [True, False, pd.NA, False, True, True]
t = s.where(cond=cond) 
Run Code Online (Sandbox Code Playgroud)

给出

t
0    0.0
1    NaN
2    NaN
3    NaN
4    4.0
5    5.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

然而

s = pd.Series(range(6))
cond = [True, False, pd.NA, False, True, True]
s.where(cond=cond, inplace=True) 
Run Code Online (Sandbox Code Playgroud)

给出

s
0    0.0
1    NaN
2    2.0
3    NaN
4    4.0
5    5.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

这似乎是一个设计选择。事实上,在查看源代码时,我们看到以下内容:

# make sure we are boolean
 fill_value = bool(inplace)
 cond = cond.fillna(fill_value) 
Run Code Online (Sandbox Code Playgroud)

这意味着条件中的空值根据 的值以不同的方式填充inplace

所以我的问题是:我错过了什么以及为什么这种行为是可取的(假设它不仅仅是一个错误)?

根据文档,该参数inplace用于指示是否对数据执行就地操作。我当然不会期望它的值会改变操作本身的结果。(当然,使用 时也会观察到相同的差异Series.mask,因为Series.mask(cond)被定义为Series.where(~cond)

编辑:正如 @Corralien 指出的,要观察相同的行为并且Series.mask不出现异常,首先将条件转换为 Panda 的布尔数据类型,即将上面的条件替换为 cond = pd.Series([True, False, pd.NA, False, True, True]).astype(pd.BooleanDtype()) 这是从 a 定义过滤器时获得的条件类型pd.StringDtype()例如,具有可为空类型列的数据框。