使用 pandas 滚动的数据帧所有值的实际平均值

Real average on all values of a dataframe using rolling with pandas

如果我有这样的 df:

    a001         a002           
      1            1             
    NaN            7             
    NaN          NaN          
    NaN            3             
    NaN          NaN         
    2              2           
    NaN            6 

如果我想计算 2 行的 window 的平均值,我可以使用这个:

df['rolling_mean'] = df.mean(axis=1).rolling(window=2, min_periods=1).mean()

哪个returns:

    a001  a002  rolling_mean
0   1.0   1.0           1.0
1   NaN   7.0           4.0
2   NaN   NaN           7.0
3   NaN   3.0           3.0
4   NaN   NaN           3.0
5   2.0   2.0           2.0
6   NaN   6.0           4.0

这是 window 两行的平均值,使用单行元素的平均值。因此,例如第 1 行 (4) 中的 rolling_mean 是第 0 行 (1+1)/2 = 1 的平均值与第 1 行 (7) 的值之间的平均值:(1+7)/2 = 4

如果我想要取前两行中这 3 个值的平均值,结果应该是:(1+1+7)/3 = 3。 为了获得它,我使用了这个:

df2 = df.copy()
df['sum'] = df2.sum(axis=1).rolling(window=1, min_periods=1).mean()
df['count'] = df2.count(axis=1).rolling(window=1, min_periods=1).mean()
df['last_2'] = df['sum'].rolling(window=2, min_periods=1).sum() / df['count'].rolling(window=2, min_periods=1).sum()

那 returns 我想要的输出:

   a001  a002  sum  count     last_2
0   1.0   1.0  2.0    2.0   1.000000
1   NaN   7.0  7.0    1.0   3.000000
2   NaN   NaN  NaN    0.0   7.000000
3   NaN   3.0  3.0    1.0   3.000000
4   NaN   NaN  NaN    0.0   3.000000
5   2.0   2.0  4.0    2.0   2.000000
6   NaN   6.0  6.0    1.0   3.333333

我的问题是:是否有更优雅和 pythonic 的方式来做到这一点?谢谢

对于我来说工作:

df['last_2'] = (df.sum(axis=1).rolling(window=2, min_periods=1).sum() / 
                df.count(axis=1).rolling(window=2, min_periods=1).sum())
print (df)

   a001  a002    last_2
0   1.0   1.0  1.000000
1   NaN   7.0  3.000000
2   NaN   NaN  7.000000
3   NaN   3.0  3.000000
4   NaN   NaN  3.000000
5   2.0   2.0  2.000000
6   NaN   6.0  3.333333