gpt4 book ai didi

python - 使用 group by 获取 n 个最小值但有重复项

转载 作者:行者123 更新时间:2023-12-04 09:14:22 26 4
gpt4 key购买 nike

假设我有这样的 Pandas DataFrame:

>>> 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 获得一个包含重复项的前 2 个(实际上是 n 个值)值的新 DataFrame,如下所示:
   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 个以上的记录

最佳答案

使用 DataFrame.drop_duplicates 在第一步,然后获取最高值并最后使用 DataFrame.merge :

df1 = df.drop_duplicates(['id','value']).sort_values(['id','value']).groupby('id').head(2)
df = df.merge(df1)
print (df)
id value
0 1 1
1 1 1
2 1 2
3 1 2
4 2 1
5 2 2
6 2 2
7 3 1
8 4 1
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]})

df1 = df.drop_duplicates(['id','value']).sort_values(['id','value']).groupby('id').head(2)
df = df.merge(df1)
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
8 3 1
9 4 1
或者在 GroupBy.transform 中使用自定义 lambda 函数并在 boolean indexing 中过滤:
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

关于python - 使用 group by 获取 n 个最小值但有重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63282258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com