我有以下熊猫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)
是否应该像2019年1月1日那样重复数量,其中A,B和C各自具有5个数量,所以不包括D和E,但是我希望包括D和E.我想要一种独特的nlargest(3)东西。
这是我期望的结果,无论是否有1个以上的标签共享相同的数量,我在DF中都拥有3个最大的不同数量:
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
提前谢谢!
答案 0 :(得分:2)
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))
答案 1 :(得分:2)
您可以找到每个组的唯一值,获取具有三个最大值的列表,然后选择此列表中的行。然后,您可以加入表的其余部分:
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