Giả sử tôi có DataFrame như thế này:
>>> df = pd.DataFrame({'id':[1,1,1,2,2,2,2,3,4],'value':[1,2,3,1,2,3,4,1,1]})
>>> df
id value
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
Tôi muốn nhận một DataFrame mới với 2 bản ghi hàng đầu cho mỗi id, như thế này:
id value
0 1 1
1 1 2
3 2 1
4 2 2
7 3 1
8 4 1
Tôi có thể làm điều đó với các bản ghi đánh số trong nhóm sau nhóm bằng cách:
>>> dfN = df.groupby('id').apply(lambda x:x['value'].reset_index()).reset_index()
>>> dfN
id level_1 index value
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 value
0 1 1
1 1 2
3 2 1
4 2 2
7 3 1
8 4 1
Nhưng có cách tiếp cận hiệu quả / thanh lịch hơn để làm điều này? Và cũng có cách tiếp cận thanh lịch hơn đối với các bản ghi số trong mỗi nhóm (như hàm cửa sổ SQL row_number () ).