在熊猫中使用groupby过滤最多3个计数

时间:2018-11-14 01:42:43

标签: python pandas filter max

我正在使用包含20K行的数据框。 我创建了一个示例数据框,如下所示以复制数据框。

df = pd.DataFrame()
df ['Team'] = ['A1','A1','A1','A2','A2','A2','B1','B1','B1','B2','B2','B2']
df ['Competition'] = ['L1','L1','L1','L1','L1','L1','L2','L2','L2','L2','L2','L2']
df ['Score_count'] = [2,1,3,4,7,8,1,5,8,5,7,1]

我想通过使用groupby(['Competition','Team'])

将Score_count的两个最大值保留在行中

通过使用以下transform(max),我可以使得分最高的行保持不变:

idx = df.groupby(['Competition','Team'])['Score_count'].transform(max) == df['Score_count']
df = df[idx]

但是我想做的是为同一分组依据保留n个最大值(在这种情况下为两个最大值)Score_count。

我该怎么办?

以下是我的预期输出:

       Team     Competition  Score_count
0       A1          L1             3
1       A1          L1             2
2       A2          L1             8
3       A2          L1             7
4       B1          L2             8
5       B1          L2             5
6       B2          L2             7
7       B2          L2             5

您也可以参考下面的图片以获得预期的输出:

enter image description here

有人可以建议如何做吗? 谢谢,

Zep

1 个答案:

答案 0 :(得分:2)

groupby 团队竞争,然后使用.nlargest取两个最大值:

df.groupby(['Team', 'Competition']).Score_count.nlargest(2).reset_index([0,1])

#   Team Competition  Score_count
#2    A1          L1            3
#0    A1          L1            2
#5    A2          L1            8
#4    A2          L1            7
#8    B1          L2            8
#7    B1          L2            5
#10   B2          L2            7
#9    B2          L2            5

要删除原始索引:

df.groupby(['Team', 'Competition']).Score_count.nlargest(2).reset_index([0,1]).reset_index(drop=True)

#  Team Competition  Score_count
#0   A1          L1            3
#1   A1          L1            2
#2   A2          L1            8
#3   A2          L1            7
#4   B1          L2            8
#5   B1          L2            5
#6   B2          L2            7
#7   B2          L2            5