2017-06-12 9 views
1

下記の***と記された線を最適化するために使用できる、パンダ(またはNumPy?)への組み込み集約はありますか?集約のためのパンダの組み込み

>>> import numpy as np 
    >>> import pandas as pd 
    >>> 
    >>> df = pd.DataFrame({'A':[1,21,4,5,3,3,5,653,2], 'B':[1,2,3,4,5,6,7,8,9]}) 
    >>> steps = 3 
    >>> 
    >>> values = df.iloc[:,0] 
    >>> current = values[-steps:] 
    >>> old = values[:-steps] 
*** >>> mean = np.array([old[i::steps].mean() for i in range(steps)]) *** 
    >>> df.iloc[-steps:,0] = current - mean 
    >>> df1 = df.iloc[-steps:] 
    >>> df1 
      A B 
    6 2.0 7 
    7 641.0 8 
    8 -1.5 9 

答えて

3

私たちは、forループのためにそうように、ボトルネックであるように思われ、ベクトル化方法でmeanを計算することができ - 配列のサイズは割り切れないかもしれないときのケースについては

mean = old.values.reshape(-1,steps).mean(axis=0) 

steps、使用可能np.bincount -

ids = np.arange(a.size)%steps 
mean= np.bincount(ids, a)/np.bincount(ids) 
+0

私が探していたものは、きれいなソリューションです。 –

+0

シェイプが 'steps'で簡単に分割できないときは、' ValueError:サイズ3025の配列をシェイプ(1008)に変形できません 'というエラーが表示されます。 'steps'を整列させるまで、配列に最初の値を追加する簡単な方法を知っていますか? –

+1

@JonasByströmそのための1つのソリューションを追加しました。他の方法もありますが、投稿されたものはそのようなケースを処理するための最短のようです。 – Divakar

関連する問題