我有一个Pandas数据框,如:
ID Group Rank include
1 Group1 1 0
2 Group1 2 1
3 Group1 3 0
4 Group1 4 1
5 Group2 1 0
6 Group2 2 0
7 Group2 3 1
8 Group2 4 1
9 Group2 5 1
我想选择满足以下条件的子集: - 该组最多3行 - 包括include = 1的所有行(每组不超过3个) - 最小化每组总排名
基本上,我想从每个组中选择TOP“N”记录,但include = 1的行优先于其余行。
输出数据框:
ID Group Rank include
1 Group1 1 0
2 Group1 2 1
4 Group1 4 1
7 Group2 3 1
8 Group2 4 1
9 Group2 5 1
我尝试了几种方法,但没有一种方法真的奏效,现在我被卡住了 请帮忙!
答案 0 :(得分:2)
首先按条件对数据框进行排序:
df.sort_values(['include', 'Rank'], ascending=[False, True], inplace=True)
然后groupby Group
并获得每个组的前3行。另外,添加sort_values
以使最终数据框在Group
上排序,然后在Rank
上排序,如下所示:
df.groupby('Group').head(3).sort_values(['Group', 'Rank'])
输出:
ID Group Rank include
0 1 Group1 1 0
1 2 Group1 2 1
3 4 Group1 4 1
6 7 Group2 3 1
7 8 Group2 4 1
8 9 Group2 5 1