代码之家  ›  专栏  ›  技术社区  ›  Joe

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

  •  1
  • Joe  · 技术社区  · 6 年前

    如果我有这样的df:

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

    如果我想计算两行窗口的平均值,我可以使用这个:

    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
    

    这是两行窗口上的平均值,使用单行元素的平均值。例如 rolling_mean 第1行(4)是第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()
    

    返回所需输出:

       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
    

    我的问题是:有没有一种更优雅、更像蟒蛇的方式来做到这一点?谢谢

    1 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    6 年前

    对于我的工作:

    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