1

次のような 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 行のウィンドウでの平均です。たとえば、rolling_meanrow1 の (4) は、row0 の平均と row1(1+1)/2 = 1の値 (7)の平均です。(1+7)/2 = 4

代わりに、最初の 2 行のこれら 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

私の質問は次のとおりです:これを行うためのよりエレガントでpythonicな方法はありますか? ありがとう

4

1 に答える 1