熊猫在每组中获得最多的n项记录

假设我有如下数据帧:

&gt&燃气轮机&燃气轮机;数据帧({'id':[1,1,1,2,2,2,2,3,4],'value':[1,2,3,1,2,3,4,1]})
&燃气轮机&燃气轮机&燃气轮机;df
id值
0   1      1
1   1      2
2   1      3
3   2      1
4   2      2
5   2      3
6   2      4
7   3      1
8   4      1

我想获得一个新的数据帧,每个id有前2条记录,如下所示:

id值
0   1      1
1   1      2
3   2      1
4   2      2
7   3      1
8   4      1

我可以通过以下方式对一组又一组的记录进行编号:

&gt&燃气轮机&燃气轮机;dfN=df.groupby('id')。应用(lambda x:x['value'])。重置索引())。重置索引()
&燃气轮机&燃气轮机&燃气轮机;dfN
id级别_1索引值
0   1        0      0      1
1   1        1      1      2
2   1        2      2      3
3   2        0      3      1
4   2        1      4      2
5   2        2      5      3
6   2        3      6      4
7   3        0      7      1
8   4        0      8      1
&燃气轮机&燃气轮机&燃气轮机;dfN[dfN['level_1']<=1][['id','value']]
id值
0   1      1
1   1      2
3   2      1
4   2      2
7   3      1
8   4      1

但有没有更有效/优雅的方法来实现这一点?还有更优雅的方法来对每个组中的记录进行编号(如SQL窗口函数row_number())

您是否尝试了df.groupby(’id’).head(2)

生成的输出:

&gt&燃气轮机&燃气轮机;df.groupby('id')。标题(2)
id值
身份证件
1  0   1      1
1   1      2 
2  3   2      1
4   2      2
3  7   3      1
4  8   4      1

(请记住,根据您的数据,您可能需要在之前进行订购/排序)

编辑:如提问者所述,使用df.groupby('id').head(2).重置索引(drop=True)删除多重索引并展平结果

&gt&燃气轮机&燃气轮机;df.groupby('id').head(2).重置索引(drop=True)
id值
0   1      1
1   1      2
2   2      1
3   2      2
4   3      1
5   4      1

发表评论