[英]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.