2016-10-21 4 views
3

MASKが真である私は、このグループ内の前の値に差異を取得したいと思い、すべての行については、このパンダ:前の値に違い

GROUP VALUE MASK 
    1  5  false 
    2  10  false 
    2  20  false 
    1  7  true 
    3  17 false 
    3  18 false 
    1  100 false 
    1  200 true 

のように見えるパンダデータフレーム、すなわちを考えると、結果は

VALUE DIFF 
    7  2 
    200 100 

とする必要があります。これをPandasでどのように計算できますか?

約200万行と100万のグループを持つ大規模なデータフレームに対して、この高速をどのように計算できますか?

+0

以下のスピードのコメントに反応して:グループの数が多いGROUPBYの速さで大きな改善があったとして、あなたはパンダの新しいバージョンを使用していることを確認してください。それとは別に、同じサブセットで繰り返し計算を行う場合は、データのサブセット化について考えるかもしれません。 – JohnE

答えて

1

使用groupbydiff'MASK'

pd.concat([df.VALUE, df.groupby('GROUP').VALUE.diff()], 
      axis=1, keys=['VALUE', 'DIFF'])[df.MASK] 

enter image description here

+0

ステップ 'df.groupby( 'GROUP')。VALUE.diff()'は本当に遅いようです。それをスピードアップする方法はありますか? – David

2

実際にボトルネックがgroupbyです。この特定の問題に実際にgroupbyを使用する必要はありません。 sortにデータフレームGROUPを入力するには、ソートされたデータフレームでdiffを実行し、MASKによってfilterを実行してください。私たちは、あなたがこの

を使用することができ、(最初の要素は差分演算のために無意味であるため)MASKは、常に各グループの最初の要素のために偽であると想定し、前とソート後にグループ内で変わらず

を順序を維持するためにkind='mergesort'を使用する必要があります。

pd.concat([df.VALUE, df.sort_values(by="GROUP", kind='mergesort').VALUE.diff()], axis=1, keys=['VALUE', 'DIFF'])[df.MASK] 

性能試験:

MAXN = 200000 
GROUPS = 10000 
df = pd.DataFrame({"GROUP": np.ceil(np.random.rand(MAXN)*GROUPS), "VALUE": np.ceil(np.random.rand(MAXN)*10000), "MASK":np.floor(np.random.rand(MAXN)*2).astype("bool")}) 

%timeit t1 = pd.concat([df.VALUE, df.groupby('GROUP').VALUE.diff()], axis=1, keys=['VALUE', 'DIFF'])[df.MASK] 
# 1 loop, best of 3: 1.28 s per loop 

%timeit t2 = pd.concat([df.VALUE, df.sort_values(by="GROUP", kind='mergesort').VALUE.diff()], axis=1, keys=['VALUE', 'DIFF'])[df.MASK] 
#10 loops, best of 3: 63.1 ms per loop 

#MAXN = 2000000 
#GROUPS = 1000000 
%timeit t2 = pd.concat([df.VALUE, df.sort_values(by="GROUP", kind='mergesort').VALUE.diff()], axis=1, keys=['VALUE', 'DIFF'])[df.MASK] 
#1 loop, best of 3: 1.24 s per loop 
+0

それは10秒以上かかるので、私は結果を待っていませんでした:P。 – TurtleIzzy

+0

十分に十分ですが、質問に指定されている行数とグループ数のタイミングを表示していただけです。いい答えだ! – JohnE

関連する問題