Rishab Nagaraj:
以下は、サンプルデータフレームです。私の実際のデータセットは30K行があります。
df = pd.DataFrame({'Account': [30, 30, 30, 30, 30, 30, 30, 40, 40, 40],
'Start': [2, 2, 2, 2, 2, 3, 3, 1, 1, 1],
'Amount' : [500, 600, 800, 200, 700, 10, 800, 10, 50, 70]})
Account Start Amount
0 30 2 500
1 30 2 600
2 30 2 800
3 30 2 200
4 30 2 700
5 30 3 10
6 30 3 800
7 40 1 10
8 40 1 50
9 40 1 70
私は±50%での行の金額行2の金額から1つの異なり(アカウントとスタートでグループ化された)すべての行を検索します。私はこのように見える結果を期待しています。
Account Start Amount
0 30 2 500
1 600
2 800
8 40 1 50
9 70
行3 200は、行2の量だけでなく、行3の量の50%未満であるように、行3が除外され
、それが開始= 2の最後の要素であるように、行4が除外され、前の行も除外され。
同様に、行5および6は除外されます。
10行8における量の50%未満であるように、行7は除外されます。
PS:最後のデータセットでは、アカウントとスタートの各グループは少なくとも4行を持っている必要があります。
これを効率的に行う方法はありますか?
ALollz:
私たちは、使用pct_change
それは-50%と50%の間だかどうかをチェックします。あなたが行のペアをしたいので、私たちは、このマスクまたは(私たちはpct_changeを計算する逆方向にシフト)シフトマスクをチェックする必要があります。私たちは、個別に各グループにこの機能を適用します。
def keep_within_pct(gp, shift=1, pcts=(-0.5, 0.5)):
m = gp['Amount'].pct_change(-shift).between(*pcts)
return gp[m | m.shift(shift).fillna(False)]
df.groupby(['Account', 'Start'], group_keys=False).apply(keep_within_pct)
Account Start Amount
0 30 2 500
1 30 2 600
2 30 2 800
8 40 1 50
9 40 1 70