Python 使用group by获得n个最小值,但有重复项

Python 使用group by获得n个最小值,但有重复项,python,pandas,greatest-n-per-group,Python,Pandas,Greatest N Per Group,假设我有如下数据帧: >>> df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2,2,2,2,3,4],'value':[1,1,1,1,3,1,2,2,3,3,4,1,1]}) >>> df id value 1 1 1 1 1 1 1 1 1 3 2 1 2 2 2 2 2 3 2 3 2 4 3 1 4

假设我有如下数据帧:

>>> df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2,2,2,2,3,4],'value':[1,1,1,1,3,1,2,2,3,3,4,1,1]})
>>> df
id  value
1      1
1      1
1      1
1      1
1      3
2      1
2      2
2      2
2      3
2      3
2      4
3      1
4      1
   id  value
0   1      1
1   1      1
3   1      1
4   1      1
5   1      3
6   2      1
7   2      2
8   2      2
9   3      1
10  4      1
我想为每个id(包括重复项)获取一个具有前2个(实际上是n个值)值的新数据帧,如下所示:

>>> df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2,2,2,2,3,4],'value':[1,1,1,1,3,1,2,2,3,3,4,1,1]})
>>> df
id  value
1      1
1      1
1      1
1      1
1      3
2      1
2      2
2      2
2      3
2      3
2      4
3      1
4      1
   id  value
0   1      1
1   1      1
3   1      1
4   1      1
5   1      3
6   2      1
7   2      2
8   2      2
9   3      1
10  4      1
我尝试过使用head()和nsmallest(),但我认为它们不会包含重复项。有更好的方法吗

编辑以明确说明,如果第一步中使用的重复数据超过2个,则我希望每组记录超过2条,然后获取最大值和最后一次使用:


或使用自定义lambda函数,并在以下位置进行过滤:



如果有三个ID=1和Value=1,这会捕获三个ID=1和Value=1吗?或者像50?@Jogianni-我的解决方案在每个重复组中获得前2个唯一值,您还需要其他值吗?
df = df[df.groupby('id')['value'].transform(lambda x: x.isin(sorted(set(x))[:2]))]
print (df)
    id  value
0    1      1
1    1      1
2    1      2
3    1      2
5    2      1
6    2      2
7    2      2
11   3      1
12   4      1
df = df[df.groupby('id')['value'].transform(lambda x: x.isin(sorted(set(x))[:2]))]
print (df)
    id  value
0    1      1
1    1      1
2    1      1
3    1      1
4    1      3
5    2      1
6    2      2
7    2      2
11   3      1
12   4      1