numpy 如何找到具有可变区间的列的移动平均值(基于最后n个非空值)?

xv8emn3q  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个 Dataframe ,格式如下:
| Datetime|值|马|
| --|--|--|
| 1月1| 1 |没有一|
| 1月2日| 2 |没有一|
| 1月3日| 1 |没有一|
| 1月4日|N/A|没有一|
| 1月5日| 2 |没有一|
| 1月6日|N/A|没有一|
| 1月7日|N/A|没有一|
| 1月8日| 3 |没有一|
我希望计算“值”列的移动平均值,条件是最后3个非空值。
所需输出:
| Datetime|值|马|
| --|--|--|
| 1月1| 1 | 1 |
| 1月2日| 2 |1.5|
| 1月3日| 1 |一点三三|
| 1月4日|没有一|一点三三|
| 1月5日| 2 |一点六七|
| 1月6日|没有一|一点六七|
| 1月7日|没有一|一点六七|
| 1月8日| 3 | 2 |
例如,在1月8日的行中,移动平均值采用最后3个非空值(3,2,1)来给予值2,而1月3日仅采用(1,2,1)来计算移动平均值。因此,由于这种情况,我不能使用rolling.mean()方法。我也尽量避免使用一个循环,如果可能的话,因为框架是巨大的。解决这个问题的最好办法是什么?

jvlzgdj9

jvlzgdj91#

首先通过Series.dropna删除缺失值,计算滚动平均值,然后向前发送缺失值:

df['MA'] = df['Value'].dropna().rolling(3, min_periods=1).mean()
df['MA'] = df['MA'].ffill()

或者使用方法ffill添加Series.reindex

df['MA'] = (df['Value'].dropna().rolling(3, min_periods=1).mean()
                       .reindex(df.index, method='ffill'))
print (df)
  Datetime  Value        MA
0    1 Jan    1.0  1.000000
1    2 Jan    2.0  1.500000
2    3 Jan    1.0  1.333333
3    4 Jan    NaN  1.333333
4    5 Jan    2.0  1.666667
5    6 Jan    NaN  1.666667
6    7 Jan    NaN  1.666667
7    8 Jan    3.0  2.000000
oipij1gg

oipij1gg2#

您可以使用dropna删除NaN,然后使用method=ffill计算rolling.meanreindex以填充缺失值:

df['MA'] = (df.dropna(subset=['Value'])['Value']
              .rolling(3, min_periods=1).mean()
              .reindex(df.index, method='ffill')
           )

输出量:

Datetime  Value        MA
0    1 Jan    1.0  1.000000
1    2 Jan    2.0  1.500000
2    3 Jan    1.0  1.333333
3    4 Jan    NaN  1.333333
4    5 Jan    2.0  1.666667
5    6 Jan    NaN  1.666667
6    7 Jan    NaN  1.666667
7    8 Jan    3.0  2.000000

相关问题