在熊猫数据框中进行分组之后,在每个组中选择前3个类别

时间:2019-06-20 07:53:28

标签: python pandas dataframe pandas-groupby

所以我的数据框现在看起来像这样:

| Name | Type | Class   | Amount |
|------|------|---------|--------|
| Abel | A    | Chinese | 2      |
| Abel | B    | English | 5      |
| Abel | C    | Science | -1     |
| Abel | D    | Physics | -10    |
| Cain | C    | Chinese | -5     |
| Cain | B    | Science | 0      |
| Cain | A    | English | 30     |
| Cain | D    | Chinese | 2      |
|------|------|---------|--------|

数据样本:

data = {'Name': ['Abel', 'Abel', 'Abel', 'Abel', 'Cain', 'Cain', 'Cain', 'Cain'],
'Type': ['A', 'B', 'C', 'D', 'C', 'B', 'A', 'D'],
'Class': ['Chinese', 'English', 'Science', 'Physics', 'Chinese', 'Science', 'English', 'Chinese'],
'Amount': [2,5,-1,-10,-5,0,30,2]}

我正在尝试根据数量查找每个名字的前n个类型和前n个类。

我尝试了df.groupby([“ Name”,“ Type”])。sum(),该分组为我提供了分组,但是我该如何选择前5个分组,以便将它们转换为5个不同的列?

例如前3种类型的最终输出应该是这样的,前3类是类似的东西,除了列是从1类到3类:

| Name | Type 1 | Type 2 | Type 3 |
|------|--------|--------|--------|
| Abel | B      |   A    |   C    |
| Cain | A      |   D    |   B    |

我尝试了sort_values,然后尝试了.head(5),但排序将负数视为最大。此外,结果也不属于分组范围。有什么帮助吗?谢谢!

2 个答案:

答案 0 :(得分:1)

使用:

#sorting by both columns
df1 = df.sort_values(['Name','Amount'], ascending=[True, False])
#create counter column used for later columns names
df1['g'] = df1.groupby('Name').cumcount().add(1)
#filter top3
df1 = df1[df1['g'] <= 3]
#reshape by pivot
df2 = df1.pivot('Name','g','Type').add_prefix('Type ').reset_index().rename_axis(None, axis=1)
print (df2)
   Name Type 1 Type 2 Type 3
0  Abel      B      A      C
1  Cain      A      D      B

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题,但是您可以使用

df.nlargest(5,["Amount"])

这将选择5个最大金额。您可以调整5。