Pandas groupby dropna=False 不适用于申请

Pandas groupby dropna=False does not work for apply

假设我有以下数据框。

df = pd.DataFrame({'a':[None,None,None], 'b':[1,1,2], 'c': [1,1,3], 'd': [1,1,1]})
df.groupby(['a', 'b', 'c'], dropna=True).d.sum()
=> Series([], Name: d, dtype: int64)
df.groupby(['a', 'b', 'c'], dropna=False).d.sum()
=> a    b  c
   NaN  1  1    2
        2  3    1
   Name: d, dtype: int64

输出符合 dropna 标志的预期。

现在,我定义了一个要应用的自定义函数。

def _is_outlier(s):
    lower_limit = s.mean() - (s.std() * 2)
    upper_limit = s.mean() + (s.std() * 2)
    return ~s.between(lower_limit, upper_limit)
df.groupby(['a', 'b', 'c'], dropna=False).d.apply(_is_outlier)
=> Series([], Name: d, dtype: bool)
df.groupby(['a', 'b', 'c'], dropna=True).d.apply(_is_outlier)
=> Series([], Name: d, dtype: bool)

两个returns空系列。对于应用功能,dropna 似乎没有按预期工作。
有人知道这个问题的解决方法吗?

谢谢,

看来是1.3.3版本修复的bug。来自 release notes:

Fixed regression in GroupBy.apply() where nan values were dropped even with dropna=False (GH43205)

您可以尝试更新 pandas 并检查您是否仍然遇到此问题?

做成df然后重新设置索引能解决吗?

pd.DataFrame(df.groupby(['a', 'b', 'c'], dropna=False).d.sum()).reset_index()