Python Panda-从第3列中获取前3个最大值,按第1列分组,同时显示第2列



以下是数据:

col1 col2 col3
类别1 subcat1 10
类别1 子类别2 15
类别1 子类别3 1
类别1 子类别4 23
类别2 子类别1 10
类别2 subcat2 99
类别2 子类别3 23
类别2 子类别4 12
类别2 子类别5 10
类别2 子类别6 11
类别2 子类别7 45
类别2 子类别8 105
类别3 子类别1 2
类别3 子类别2 9
类别3 subcat3 14
类别3 子类别4 25

至于您的演示数据:

df = pd.DataFrame({'col1': ['category1', 'category1','category1', 'category1', 'category2', 'category2','category2', 'category2', 'category2', 'category2','category2', 'category2', 'category3', 'category3','category3', 'category3'],
'col2': ['subcat1', 'subcat2', 'subcat3', 'subcat4', 'subcat1', 'subcat2', 'subcat3', 'subcat4', 'subcat5', 'subcat6', 'subcat7', 'subcat8', 'subcat1', 'subcat2', 'subcat3', 'subcat4'],
'col3': [10, 15, 1, 23, 10, 99, 23, 12, 10, 11, 45, 105, 2, 9, 14, 25]})
print(df)
col1    col2    col3
0   category1   subcat1 10
1   category1   subcat2 15
2   category1   subcat3 1
3   category1   subcat4 23
4   category2   subcat1 10
5   category2   subcat2 99
6   category2   subcat3 23
7   category2   subcat4 12
8   category2   subcat5 10
9   category2   subcat6 11
10  category2   subcat7 45
11  category2   subcat8 105
12  category3   subcat1 2
13  category3   subcat2 9
14  category3   subcat3 14
15  category3   subcat4 25

这是joris在另一个问题中提供的解决方案:

df_agg = df.groupby(['col1', 'col2']).agg({'col3': sum})
a = df_agg['col3'].groupby('col1', group_keys=False).nlargest(3)
print(a)
col1       col2   
category1  subcat4     23
subcat2     15
subcat1     10
category2  subcat8    105
subcat2     99
subcat7     45
category3  subcat4     25
subcat3     14
subcat2      9

以下是解决方法,我仍然认为有更好的方法可以做到这一点,但这应该会对您有所帮助:

result = pd.DataFrame()
for item in df['category'].unique():
result = result.append(df[df.category == item].nlargest(3, 'value'))

基本上,在一种手动groupby函数中,在每个类别的子数据帧上使用nlargest方法,因为groupby对象不支持它。

最新更新