как группировать и сортировать столбцы по значению столбца в функции - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть фрейм данных, как показано ниже, мне нужно написать функцию, которая должна дать мне следующие результаты:

Входные параметры:

  1. Страна, например'INDIA'
  2. Возраст, например 'Student'

Мой входной фрейм данных выглядит так:

   Card Name    Country      Age         Code  Amount
0        AAA      INDIA    Young        House     100
1        AAA  Australia      Old     Hardware     200
2        AAA      INDIA  Student        House     300
3        AAA         US    Young     Hardware     600
4        AAA      INDIA  Student  Electricity     200
5        BBB  Australia    Young  Electricity     100
6        BBB      INDIA  Student  Electricity     200
7        BBB  Australia    Young        House     450
8        BBB      INDIA      Old        House     150
9        CCC  Australia      Old     Hardware     200
10       CCC  Australia    Young        House     350
11       CCC      INDIA      Old  Electricity     400
12       CCC         US    Young        House     200

Ожидаемый результат будет

          Code  Total Amount  Frequency  Average
0  Electricity           400          2      200
1        House           300          1      300

10 лучших (в нашем случае, мы можем получить только 2 лучших кода) для данной страны (= Индия) и возраста (= студент) на основе общей суммы суммы.Кроме того, он также должен дать новый столбец «Частота», который будет считать число.записей в этой группе и столбце «Среднее» будет общая сумма / частота

, которую я пробовал

df.groupby(['Country','Age','Code']).agg({'Amount': sum})['Amount'].groupby(level=0, group_keys=False).nlargest(10)

, что дает

Country    Age      Code       
Australia  Young    House          800
           Old      Hardware       400
           Young    Electricity    100
INDIA      Old      Electricity    400
           Student  Electricity    400
                    House          300
           Old      House          150
           Young    House          100
US         Young    Hardware       600
                    House          200
Name: Amount, dtype: int64

, что, к сожалению, отличаетсяот ожидаемого выхода.

1 Ответ

0 голосов
/ 30 декабря 2018

Учитывая

>>> df                                                                                                                 
   Card Name    Country      Age         Code  Amount
0        AAA      INDIA    Young        House     100
1        AAA  Australia      Old     Hardware     200
2        AAA      INDIA  Student        House     300
3        AAA         US    Young     Hardware     600
4        AAA      INDIA  Student  Electricity     200
5        BBB  Australia    Young  Electricity     100
6        BBB      INDIA  Student  Electricity     200
7        BBB  Australia    Young        House     450
8        BBB      INDIA      Old        House     150
9        CCC  Australia      Old     Hardware     200
10       CCC  Australia    Young        House     350
11       CCC      INDIA      Old  Electricity     400
12       CCC         US    Young        House     200

, вы можете сначала отфильтровать ваш фрейм данных:

>>> country = 'INDIA'                                                                                                  
>>> age = 'Student'                                                                                                    
>>> tmp = df[df.Country.eq(country) & df.Age.eq(age)].loc[:, ['Code', 'Amount']]                                       
>>> tmp                                                                                                                
          Code  Amount
2        House     300
4  Electricity     200
6  Electricity     200

... и затем группу:

>>> result = tmp.groupby('Code')['Amount'].agg([['Total Amount', 'sum'], ['Frequency', 'size'], ['Average', 'mean']]).reset_index() 
>>> result                             
          Code  Total Amount  Frequency  Average
0  Electricity           400          2      200
1        House           300          1      300

Если я понимаю вашу фильтрациюкритерий на общую сумму правильно, вы можете затем выдать

result.nlargest(10, 'Total Amount')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...