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()例如,具有可为空类型列的数据框。
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |