大熊猫分组依据中非空值的移位和滚动平均值

时间:2019-05-02 15:14:06

标签: python pandas aggregation

我正在寻找一种基于过去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

2 个答案:

答案 0 :(得分:0)

我们可以将rollingmin_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()