パンダ:CAN Iフィルタ同士の間に50%の差が行のみを取得するためのデータフレーム?

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

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=402399&siteId=1