グループ内で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')