Python 如何按组获取具有最大限制的前n行
我有一个像这样的数据框Python 如何按组获取具有最大限制的前n行,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个像这样的数据框 pd.DataFrame({'A': ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10'], ...: 'B': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C'], ...: 'R': [9, 1, 7, 4, 3, 5, 2, 6, 8, 10]}) Out[3]:
pd.DataFrame({'A': ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10'],
...: 'B': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C'],
...: 'R': [9, 1, 7, 4, 3, 5, 2, 6, 8, 10]})
Out[3]:
A B R
0 C1 A 9
1 C2 A 1
2 C3 A 7
3 C4 B 4
4 C5 B 3
5 C6 B 5
6 C7 B 2
7 C8 C 6
8 C9 C 8
9 C10 C 10
A B R
1 C2 A 1
6 C7 B 2
4 C5 B 3
3 C4 B 4
5 C8 C 6
列R是我的排名列,我希望获得排名前5位的项目(列A),但是,在列B中,每组最多可以选择3个项目
我知道我可以做以下选择排名前5的项目
df.sort_values('R').head(5)
Out[10]:
A B R
1 C2 A 1
6 C7 B 2
4 C5 B 3
3 C4 B 4
5 C6 B 5
但这会从B组中选择4个项目。我如何限制每个组最多只能选择3个项目?生成的数据帧应该如下所示
pd.DataFrame({'A': ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10'],
...: 'B': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C'],
...: 'R': [9, 1, 7, 4, 3, 5, 2, 6, 8, 10]})
Out[3]:
A B R
0 C1 A 9
1 C2 A 1
2 C3 A 7
3 C4 B 4
4 C5 B 3
5 C6 B 5
6 C7 B 2
7 C8 C 6
8 C9 C 8
9 C10 C 10
A B R
1 C2 A 1
6 C7 B 2
4 C5 B 3
3 C4 B 4
5 C8 C 6
逻辑-未选择项目C6,因为它是B组的第四个项目,因此下一个可选择的项目是排名次优且不违反组限制的C8。我们可以尝试
输出
A B R
0 C2 A 1
1 C3 A 7
2 C1 A 9
3 C7 B 2
4 C5 B 3
5 C4 B 4
6 C8 C 6
7 C9 C 8
8 C10 C 10
你不是说每组最多3件吗?A组和C组只剩下1项,因为A组和C组的其他2项不属于前5项。逻辑是,首先获得前5名,然后减少到每个组最多3名。比我先获得+1个好的,为了安全起见,我会做
groupby('B',sort=False)
。
A B R
0 C2 A 1
1 C3 A 7
2 C1 A 9
3 C7 B 2
4 C5 B 3
5 C4 B 4
6 C8 C 6
7 C9 C 8
8 C10 C 10