Выберите топ-3 категории в каждой группе после группового в pandas dataframe - PullRequest
2 голосов
/ 20 июня 2019

, поэтому мой фрейм данных выглядит следующим образом:

| 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 и top 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 ]

1 голос
/ 20 июня 2019

Использование:

#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
0 голосов
/ 20 июня 2019

Я не уверен на 100%, правильно ли я понимаю ваш вопрос, но вы можете использовать

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

Это выберет 5 самых больших сумм. Вы можете настроить 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...