以下是数据:
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对象不支持它。