簡體   English   中英

Pandas Groupby nlargest(唯一的 nlargest)

[英]Pandas Groupby nlargest (unique nlargest)

我有以下熊貓 df:

date                    label              quantity
01/01/2019                A                  5
01/01/2019                B                  5
01/01/2019                C                  5
01/01/2019                D                  4
01/01/2019                E                  3
01/01/2019                F                  2
01/01/2019                G                  0
01/02/2019                A                  7
01/02/2019                B                  6
01/02/2019                C                  5
01/02/2019                D                  5
01/02/2019                E                  3
01/02/2019                F                  2
01/02/2019                G                  1
01/03/2019                A                  10
01/03/2019                B                  9
01/03/2019                C                  8
01/03/2019                D                  7
01/03/2019                E                  6
01/03/2019                F                  5
01/03/2019                G                  4

我試圖獲得每個日期前三個帶有各自標簽的數量,並保留重復的數量和標簽。

這是我的代碼:

df = df.groupby('date').apply(lambda x: x.nlargest(3, ['quantity'], keep='all')).reset_index(drop=True)

如果有重復的數量,如 01/01/2019,其中 A、B 和 C 各有 5 個數量,D 和 E 將不包括在內,但我希望包括 D 和 E。 我想要一個獨特的 nlargest(3) 類型的東西。

這是我想要的結果,我的 df 中有 3 個最大的不同數量,無論是否有 1 個以上的標簽共享相同的數量:

date                    label              quantity
01/01/2019                A                  5
01/01/2019                B                  5
01/01/2019                C                  5
01/01/2019                D                  4
01/01/2019                E                  3
01/02/2019                A                  7
01/02/2019                B                  6
01/02/2019                C                  5
01/02/2019                D                  5
01/03/2019                A                  10
01/03/2019                B                  9
01/03/2019                C                  8

先感謝您!

def get_slice(df):
    x_vals = df['quantity'].drop_duplicates().nlargest(3)
    return df[df['quantity'].isin(x_vals)]

print(df.groupby('date').apply(get_slice).reset_index(drop=True))

您可以為每個組找到唯一值,獲取具有三個最大值的列表並選擇此列表中的行。 然后你可以加入表格的其余部分:

df1 = df.groupby('date')['quantity'].\
apply(lambda x: x[x.isin(np.sort(x.unique())[-3:])]).\
reset_index(level=0).join(df['label'])

print(df1)

輸出:

          date  quantity label
0   01/01/2019         5     A
1   01/01/2019         5     B
2   01/01/2019         5     C
3   01/01/2019         4     D
4   01/01/2019         3     E
7   01/02/2019         7     A
8   01/02/2019         6     B
9   01/02/2019         5     C
10  01/02/2019         5     D
14  01/03/2019        10     A
15  01/03/2019         9     B
16  01/03/2019         8     C

暫無
暫無

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

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