python - 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
这是预期的还是有针对这种情况的替代方案?
解决方案
您可以使用“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