首页 > 解决方案 > Pandas 1.1.0 groupby dropna=False 参数与滚动窗口的意外行为

问题描述

在 Pandas 1.1.0 中,在 groupby 中引入 dropna=False 作为参数以允许在组键中使用 NA。下面的正常行为示例:

data = {'group':['g1', 'g1', 'g1', np.nan, 'g1', 'g1', 'g2', 'g2', 'g2', 'g2', np.nan], 
                    'A':[3, 1, 8, 2, 6, -1, 0, 13, -4, 0, 1], 
                    'B':[5, 2, 3, 7, 11, -1, 4,-1, 1, 0, 2]} 
df = pd.DataFrame(data)
df.groupby('group',dropna=False)['A'].mean()

#### Output
group
g1     3.40
g2     2.25
NaN    1.50
Name: A, dtype: float64

但是,我们看不到滚动 groupby 的这种行为。NA 未添加到组密钥。

df.groupby('group',dropna=False)['A'].rolling(1,min_periods=1).mean()

#### Output
group   
g1     0     3.0
       1     1.0
       2     8.0
       4     6.0
       5    -1.0
g2     6     0.0
       7    13.0
       8    -4.0
       9     0.0
Name: A, dtype: float64

这是预期的还是有针对这种情况的替代方案?

标签: pythonpandas

解决方案


您可以使用“NaN”临时覆盖它

data = {'group':['g1', 'g1', 'g1', np.nan, 'g1', 'g1', 'g2', 'g2', 'g2', 'g2', np.nan], 
                    'A':[3, 1, 8, 2, 6, -1, 0, 13, -4, 0, 1], 
                    'B':[5, 2, 3, 7, 11, -1, 4,-1, 1, 0, 2]} 
df = pd.DataFrame(data)
df.assign(group=lambda dfa: dfa.group.fillna("NaN"))\
    .groupby('group')['A'].rolling(1,min_periods=1).mean()

输出

group    
NaN    3      2.0
       10     1.0
g1     0      3.0
       1      1.0
       2      8.0
       4      6.0
       5     -1.0
g2     6      0.0
       7     13.0
       8     -4.0
       9      0.0
Name: A, dtype: float64

推荐阅读