我有这个数据集:
Id query count
001 abc 20
001 bcd 30
001 ccd 100
002 ace 13
002 ahhd 30
002 ahe 28
我想根据计数找到每个Id的Top2查询。所以我想看看:
Id query count
001 ccd 100
001 bcd 30
002 ahhd 30
002 ahe 28
我尝试了这两行代码:
df.groupby('Id')['count'].nlargest(2)
,"查询"列在结果中丢失,这不是我想要的。那么如何在我的结果中保持查询。
Id计数
001 100
001 30
002 30
002 28
答案 0 :(得分:2)
使用缺失列的set_index
:
df = df.set_index('query').groupby('Id')['count'].nlargest(2).reset_index()
print (df)
Id query count
0 001 ccd 100
1 001 bcd 30
2 002 ahhd 30
3 002 ahe 28
答案 1 :(得分:2)
我使用方法groupby
apply
和pd.DataFrame.nlargest
。这与pd.Series.nlargest
的不同之处在于,我必须在选择n行时指定要考虑的一组列。此解决方案保留附加到行的原始索引值,如果这对OP或最终用户来说非常重要。
df.groupby('Id', group_keys=False).apply(
pd.DataFrame.nlargest, n=2, columns='count')
Id query count
2 1 ccd 100
1 1 bcd 30
4 2 ahhd 30
5 2 ahe 28
答案 2 :(得分:1)
您可以使用groupby执行此操作:
df.sort_values('count', ascending = False).groupby('Id').head(2)