Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按组获取具有最大限制的前n行_Python_Pandas_Pandas Groupby - Fatal编程技术网

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