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

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

  Date          Time   Tank       Sales       Quantity        Delivery
  2018-01-01    06:30  1          100         3444            0      
  2018-01-01    07:00  1          200         3144            0
  2018-01-01    05:30  1          100         2900            0      
  2018-01-01    07:30  1          200         2800            0
  2018-01-01    06:30  2          50          3000            0      
  2018-01-01    07:00  2          100         2950            0
  2018-01-01    05:30  2          150         2800            0      
  2018-01-01    07:30  2          100         2704            0
  2018-01-02    06:30  1          100         3444            0      
  2018-01-02    07:00  1          200         3144            0
  2018-01-02    05:30  1          100         2900            50      
  2018-01-02    07:30  1          200         2800            0
  2018-01-02    06:30  2          50          3000            0      
  2018-01-02    07:00  2          100         2950            0
  2018-01-02    05:30  2          150         2800            50     
  2018-01-02    07:30  2          100         2704            0

Я хочу агрегировать на уровне дня и резервуара, чтобы получить первое и последнее количество (упорядочение времени в порядке возрастания) за этот день и сумму продаж и доставки,Мой желаемый фрейм данных будет

  Date          Tank    Open    Close   Sales    Delivery
  2018-01-01    1       2900    2800    600      0         
  2018-01-01    2       2800    2704    400      0          
  2018-01-02    1       2900    2800    600      50     
  2018-01-02    2       2800    2704    500      50

В настоящее время я выполняю следующие действия в пандах

Это для получения первого и последнего количества дней и времени на уровне танка в порядке возрастания.

  data_open_close_inv = data.sort_values(['Date','Tank','Time']).groupby(['Date','Tank'])['Quantity'].agg(['first','last']).reset_index()

И затем я собираю это для общей суммы продаж и доставки

data_agg = data.groupby(['Date','Tank'], as_index = False).agg({'Sales':['sum'],'Delivery':['sum']}).reset_index()

И затем снова объединяю оба.

Могу ли я сделать все за один шаг в пандах?

1 Ответ

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

Можно передать один словарь с именами скалярных функций, а также списком, но необходимо сгладить столбцы MultiIndex и rename:

data_open_close_inv = (data.sort_values(['Date','Tank','Time'])
                           .groupby(['Date','Tank'])
                           .agg({'Sales':'sum','Delivery':'sum', 'Quantity':['first','last']})
                           .reset_index())

data_open_close_inv.columns = data_open_close_inv.columns.map(''.join)
d = {'Salessum':'Sales',
     'Delivery_sum':'Delivery',
     'Quantityfirst':'Open',
     'Quantitylast':'Close',
     }
data_open_close_inv = data_open_close_inv.rename(columns=d)
print (data_open_close_inv)
        Date  Tank  Sales  Deliverysum  Open  Close
0 2018-01-01     1    600            0  2900   2800
1 2018-01-01     2    400            0  2800   2704
2 2018-01-02     1    600           50  2900   2800
3 2018-01-02     2    400           50  2800   2704
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...