簡體   English   中英

使用groupby的結果過濾pandas數據幀

[英]Filter pandas data frame with results of groupby

我有一個大型數據框(40M行),如果值滿足groupby對象中的條件,我想基於一列過濾掉行。

例如,這是一些隨機數據。 'letter'列實際上有數千個唯一值:

     x   y   z  letter
0   47  86  30  e
1   58   9  28  b
2   96  59  42  a
3   79   6  45  e
4   77  80  37  d
5   66  91  35  d
6   96  31  52  d
7   56   8  26  e
8   78  96  14  a
9   22  60  13  e
10  75  82   9  d
11   5  54  29  c
12  83  31  40  e
13  37  70   2  c
14  53  67  66  a
15  76  33  78  d
16  64  67  81  b
17  23  94   1  d
18  10   1  31  e
19  52  11   3  d

在'letter'列上應用groupby,並獲取每個字母的x列的總和:

df.groupby('letter').x.sum()
>>> a    227
    b    122
    c     42
    d    465
    e    297

然后,我排序查看具有最高總和的字母,並手動識別閾值。 在此示例中,閾值可能為200。

df.groupby('letter').x.sum().reset_index().sort_values('x', ascending=False)
>>> letter    x
3      d  465
4      e  297
0      a  227
1      b  122
2      c   42

這是我被困的地方。 在原始數據框中,如果groupby的總和為'x'> 200,我想保留字母,並刪除其他行。 所以在這個例子中,它會將所有行保留為d,e或a。

我正在嘗試這樣的東西,但它不起作用:

df.groupby('letter').x.sum().filter(lambda x: len(x) > 200)

即使我過濾groupby對象,我如何使用它來過濾原始數據幀?

您可以使用groupby transform計算每行的x之和,並創建一個邏輯系列,其中包含您可以使用該條件執行子集的條件:

df1 = df[df.x.groupby(df.letter).transform('sum') > 200]

df1.letter.unique()
# array(['e', 'a', 'd'], dtype=object)

或者使用groupby.filter另一個選項:

df2 = df.groupby('letter').filter(lambda g: g.x.sum() > 200)

df2.letter.unique()
# array(['e', 'a', 'd'], dtype=object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM