所以我的数据框现在看起来像这样:
| 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),但排序将负数视为最大。此外,结果也不属于分组范围。有什么帮助吗?谢谢!
答案 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。