2017-02-13 2 views
1

ДФпанды поворотный стол, как добавить вложенные столбцы

billsec  disposition Date   Hour 
0 185   ANSWERED  2016-11-01  00 
1 0    NO ANSWER  2016-11-01  00 
2 41    ANSWERED  2016-11-01  01 
3 4    ANSWERED  2016-12-02  05 

Существует таблица, мне нужно, чтобы выйти из него сводной таблицы со следующими данными:

enter image description here

строки - это часы дня, а столбцы - дни, в дни общего количества вызовов/пропущенных/общей продолжительности вызовов.

Как добавить дополнительные столбцы (все, потерянные, время) в этой таблице. До сих пор мне приходилось вычислять общую продолжительность звонков в час и их общее число. Правда, в разных таблицах ...

df.pivot_table(rows='Hour',cols='Date',aggfunc=len,fill_value=0) 
df.pivot_table(rows='Hour',cols='Date',aggfunc=sum,fill_value=0) 
+2

Добро пожаловать в StackOverflow. Пожалуйста, разместите свои наборы данных как текст, чтобы люди могли копировать и вставлять их и использовать их для кодирования ответа - это невозможно, если вы используете изображения. Пожалуйста, прочитайте [как сделать хорошие воспроизводимые примеры pandas] (http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) – MaxU

+1

@MaxU Исправлено, я надеюсь, что это правильно – luboff

+0

Could вы также объясните, как вы хотите рассчитать столбцы «Все», «Потерянные», «Время»? – MaxU

ответ

0

IIUC вы можете сделать это следующим образом:

предполагая, что мы имеем следующую DataFrame:

In [248]: df 
Out[248]: 
      calldate billsec disposition 
0 2016-11-01 00:05:26  185 ANSWERED 
1 2016-11-01 00:01:26  0 NO ANSWER 
2 2016-11-01 00:05:19  41 ANSWERED 
3 2016-11-01 00:16:02  4 ANSWERED 
4 2016-11-02 01:16:02  55 ANSWERED 
5 2016-11-02 02:02:02  2 NO ANSWER 

мы можем сделать следующее:

funcs = { 
    'billsec': { 
     'all':'size', 
     'time':'sum' 
    }, 
    'disposition': { 
     'lost': lambda x: (x == 'NO ANSWER').sum() 
    } 
} 

(df.assign(d=df.calldate.dt.strftime('%d.%m'), t=df.calldate.dt.hour) 
    .groupby(['t','d'])[['billsec','disposition']].agg(funcs) 
    .unstack('d', fill_value=0) 
    .swaplevel(axis=1) 
    .sort_index(level=[0,1], axis=1) 
) 

доходность:

d 01.11   02.11 
    all time lost all time lost 
t 
0  4 230 1  0 0 0 
1  0 0 0  1 55 0 
2  0 0 0  1 2 1