как агрегировать в сводной таблице в пандах - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть следующий фрейм данных в пандах

   code     date         tank      nozzle       qty      amount
   123      2018-01-01   1         1            100      0
   123      2018-01-01   1         2            0        50
   123      2018-01-01   1         2            0        50
   123      2018-01-01   1         2            100      0 
   123      2018-01-02   1         1            0        70
   123      2018-01-02   1         1            0        50
   123      2018-01-02   1         2            100      0

Мой желаемый фрейм данных

code   date       tank     nozzle_1_qty   nozzle_2_qty  nozzle_1_amount   nozzle_2_amount
123   2018-01-01  1        100             100          0                 100
123   2018-01-02  1        0               100          120               0 

Я выполняю следующие действия в пандах ..

df= (df.pivot_table(index=['date', 'tank'], columns='nozzle',
                     values=['qty','amount']).add_prefix('nozzle_')
         .reset_index()
      )

Но,это не дает мне желаемого результата.

Ответы [ 2 ]

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

Функция агрегирования по умолчанию в pivot_table равна np.mean, поэтому необходимо изменить ее на sum, а затем сгладить MultiIndex в понимании списка:

df = df.pivot_table(index=['code','date', 'tank'], 
                    columns='nozzle', 
                    values=['qty','amount'], aggfunc='sum')
#python 3.6+
df.columns = [f'nozzle_{b}_{a}' for a, b in df.columns]
#python bellow
#df.columns = ['nozzle_{}_{}'.format(b,a) for a, b in df.columns]
df = df.reset_index()
print (df)
   code        date  tank  nozzle_1_amount  nozzle_2_amount  nozzle_1_qty  \
0   123  2018-01-01     1                0              100           100   
1   123  2018-01-02     1              120                0             0   

   nozzle_2_qty  
0           100  
1           100  
0 голосов
/ 17 декабря 2018

Я не очень часто использую pivot_table в пандах, но вы можете получить свой результат, используя groupby и некоторые изменения.

df = df.groupby(['code', 'date', 'tank', 'nozzle']).sum().unstack()

Столбцы будут MultiIndex, которые вы, возможно, захотите переименовать.

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