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()
假设我有以下数据框。
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()