グループ内でpandas.shift()を使用する



Use Pandas Shift Within Group



解決:

パンダのグループ化されたオブジェクトには、groupby.DataFrameGroupBy.shiftメソッド。各グループの指定された列をシフトします。 NS 通常のデータフレームと同じように、期間シフト方法:

df ['prev_value'] = df.groupby( 'object')['value']。shift()

次のサンプルデータフレームの場合:



print(df)オブジェクト期間値0 1 1 24 1 1 2 67 2 1 4 89 3 2 4 5 4 2 23 23

結果は次のようになります。

オブジェクト期間値prev_value0 1 1 24 NaN 1 1 2 67 24.0 2 1 4 89 67.0 3 2 4 5 NaN 4 2 23 23 5.0 

DataFrameが、単一の使用可能なグループ化キーによってすでにソートされている場合DataFrame全体をシフトしてどこへ次のグループにオーバーフローする行をNaNします。多くのグループを持つより大きなDataFrameの場合、これは少し速くなる可能性があります。



df ['prev_value'] = df ['value']。shift()。where(df.object.eq(df.object.shift()))オブジェクト期間値prev_value 0 1 1 24 NaN 1 1 2 67 24.0 2 1 4 89 67.0 3 2 4 5 NaN 4 2 23 23 5.0

いくつかのパフォーマンス関連のタイミング:

import perfplot import pandas as pd import numpy as np perfplot.show(setup = lambda N:pd.DataFrame({'object':np.repeat(range(N)、5)、 'value':np.random.randint( 1、1000、5 * N)})、kernels = [lambda df:df.groupby( 'object')['value']。shift()、lambda df:df ['value']。shift()。where (df.object.eq(df.object.shift()))、]、labels = ['GroupBy'、 'Where']、n_range = [2 ** k for k in range(1、22)]、equality_check = lambda x、y:np.allclose(x、y、equal_nan = True)、xlabel = '#of Groups')

ここに画像の説明を入力してください