pandas 如何在panda中生成按列分组的滚动均值

8ehkhllq  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(114)

我试图生成col3的滚动2平均值(按col2分组)。我所遇到的困难是填充NaN值,以获取先前计算的滚动平均值。
数据框:

df = pd.read_csv(StringIO("""col1,col2,col3
0,A,1
0,A,2
0,B,3
0,B,4
1,A,5
1,A,6
1,B,7
1,B,8
2,A,9
2,A,10
2,B,11
2,B,12
3,A
3,A
3,B
3,B
4,A
4,A
4,B
4,B
"""))

已尝试:

df.groupby(["col2"])["col3"].rolling(2).mean()

col2    
A     0      NaN
      1      1.5
      4      3.5
      5      5.5
      8      7.5
      9      9.5
      12     NaN
      13     NaN
      16     NaN
      17     NaN
B     2      NaN
      3      3.5
      6      5.5
      7      7.5
      10     9.5
      11    11.5
      14     NaN
      15     NaN
      18     NaN
      19     NaN

我想要什么(以A为例):

col1 col2  col3
       0    A   1.0
       0    A   2.0
       0    B   3.0
       0    B   4.0
       1    A   5.0
       1    A   6.0
       1    B   7.0
       1    B   8.0
       2    A   9.0
       2    A  10.0
       2    B  11.0
       2    B  12.0
       3    A   NaN # (10 + 9) / 2 = 9.5
       3    A   NaN # (9.5 + 10) / 2 = 9.75
       3    B   NaN # ...
       3    B   NaN
       4    A   NaN # (9.75 + 9.5) / 2 = 9.625
       4    A   NaN # (9.625 + ...)
       4    B   NaN
       4    B   NaN

如果我们可以偏移滚动平均值,从第一个NaN开始,那就太好了。
如果这不能用rolling来完成,那么愿意使用for循环解决方案吗?

nvbavucw

nvbavucw1#

您可以尝试以下操作:

import pandas as pd
from functools import reduce

def my_fun(d):
    return reduce(lambda x, _: x.fillna(x.rolling(2, min_periods=2).mean().shift()), range(d['col3'].isna().sum()), d)

df = df.groupby('col2').apply(my_fun)
df

    col1 col2     col3
0      0    A   1.0000
1      0    A   2.0000
2      0    B   3.0000
3      0    B   4.0000
4      1    A   5.0000
5      1    A   6.0000
6      1    B   7.0000
7      1    B   8.0000
8      2    A   9.0000
9      2    A  10.0000
10     2    B  11.0000
11     2    B  12.0000
12     3    A   9.5000
13     3    A   9.7500
14     3    B  11.5000
15     3    B  11.7500
16     4    A   9.6250
17     4    A   9.6875
18     4    B  11.6250
19     4    B  11.6875

相关问题