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

时间:2018-03-22 06:54:09

标签: python pandas dataframe rolling-computation

如果我有这样的df:

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

如果我想在2行窗口上计算平均值,我可以使用它:

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

返回:

    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

这是2行窗口的平均值,使用单行元素的平均值。例如,row1(4)中的rolling_mean是row0 (1+1)/2 = 1的平均值与row1(7)的值之间的平均值:(1+7)/2 = 4

如果我想要在前两行中平均显示这三个值,我应该得到结果:(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()

返回我想要的输出:

   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的方式来做到这一点?谢谢

1 个答案:

答案 0 :(得分:1)

对我来说工作:

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