假设我有如下数据帧:
>&燃气轮机&燃气轮机;数据帧({'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
我可以通过以下方式对一组又一组的记录进行编号:
>&燃气轮机&燃气轮机;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)
生成的输出:
>&燃气轮机&燃气轮机;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)删除多重索引并展平结果
>&燃气轮机&燃气轮机;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