我正在寻找一种基于过去n天中每个组的非空值的平均值生成移动窗口的方法。
例如,如果移动窗口的大小为3,则我想根据每个 ct 列中 ct 列中的非空值来生成 MovAvg 列>分组(即滞后效应)。
Date Group ct MovAvg
1/1/71 A NaN NaN
2/1/71 A 1 NaN
3/1/71 A NaN NaN
4/1/71 A NaN 1
5/1/71 A 1 1
6/1/71 A NaN 1
7/1/71 A 0 1
8/1/71 A NaN 0.5
9/1/71 A NaN 0
10/1/71 A 1 0
11/1/71 A 0 1
1/1/71 B NaN NaN
2/1/71 B 1 NaN
3/1/71 B NaN NaN
4/1/71 B NaN 1
5/1/71 B 0 1
6/1/71 B 1 0
7/1/71 B 1 0.5
8/1/71 B NaN 0.67
9/1/71 B NaN 1
10/1/71 B 1 1
11/1/71 B 0 1
答案 0 :(得分:0)
我们可以将rolling
与min_periods=1
一起使用,这需要至少一个有效的观察,因此我们可以稍微用您的NaN
解决该问题:
df['MovAvg'] = pd.concat([d['ct'].rolling(3, min_periods=1).mean().shift() for _, d in df.groupby('Group')])
print(df)
Date Group ct MovAvg
0 1/1/71 A NaN NaN
1 2/1/71 A 1.0 NaN
2 3/1/71 A NaN 1.000000
3 4/1/71 A NaN 1.000000
4 5/1/71 A 1.0 1.000000
5 6/1/71 A NaN 1.000000
6 7/1/71 A 0.0 1.000000
7 8/1/71 A NaN 0.500000
8 9/1/71 A NaN 0.000000
9 10/1/71 A 1.0 0.000000
10 11/1/71 A 0.0 1.000000
11 1/1/71 B NaN NaN
12 2/1/71 B 1.0 NaN
13 3/1/71 B NaN 1.000000
14 4/1/71 B NaN 1.000000
15 5/1/71 B 0.0 1.000000
16 6/1/71 B 1.0 0.000000
17 7/1/71 B 1.0 0.500000
18 8/1/71 B NaN 0.666667
19 9/1/71 B NaN 1.000000
20 10/1/71 B 1.0 1.000000
21 11/1/71 B 0.0 1.000000
答案 1 :(得分:0)
df['MovAvg'] = df['ct'].groupby(df['Group']).rolling(3, min_periods=1).mean().shift()