Python PANDAS: число сводных таблиц для нескольких столбцов на одном уровне? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть фрейм данных pandas со следующим общим макетом (фиктивные данные):

trans_id,prod_id,loc,ind_1 or ind_2,ind_any
1,thing_1,place_1,ind_1,ind_any
2,thing_3,place_2,ind_2,ind_any
3,thing_2,place_1,ind_1,ind_any
4,thing_1,place_1,ind_1,ind_any
5,thing_2,place_3,ind_2,ind_any

Я могу достаточно легко создать сводную таблицу со следующим макетом:

prod_id ->

ind_1 ind_2

(n)(%)(n)(%)

loc 
|
V

Однако я пытаюсь включить дополнительный счетчик для "ind_any" на том же уровне, что и "ind_1 или ind_2", например:

prod_id ->

ind_1 ind_2 ind_any

(n)(%)(n)(%)(n)

loc 
|
V

К сожалению, я не могу просто объединить результаты, сделанные по отдельности, так как их нужно правильно упорядочить для окончательного вывода. Любые советы или хитрости будут наиболее ценится!

Изменить:

Вот желаемый выходной формат, который я бы ожидал с фиктивными данными:

       thing_1             thing_2             thing_3
       ind_1 ind_2 ind_any ind_1 ind_2 ind_any ind_1 ind_2 ind_any
       (n)(%)(n)(%)(n)     (n)(%)(n)(%)(n)     (n)(%)(n)(%)(n)        
place_1
place_2
place_3

Я адаптирую свой фактический код к фиктивным данным и сообщу, когда у меня будет возможность

1 Ответ

0 голосов
/ 08 мая 2018
import numpy as np
import pandas as pd

raw = ['trans_id', 'prod_id', 'loc', 'ind_1 or ind_2', 'ind_any', 
       '1', 'thing_1', 'place_1', 'ind_1', 'ind_any', 
       '2', 'thing_3', 'place_2', 'ind_2', 'ind_any', 
       '3', 'thing_2', 'place_1', 'ind_1', 'ind_any', 
       '4', 'thing_1', 'place_1', 'ind_1', 'ind_any', 
       '5', 'thing_2', 'place_3', 'ind_2', 'ind_any']
raw = np.asarray(raw).reshape(6,5)
df = pd.DataFrame(raw[1:, :], columns=[raw[0,:]])

df2 = pd.concat([df.loc[:,['trans_id', 'prod_id', 'loc', 'ind_1 or ind_2']].rename(columns={'ind_1 or ind_2':'ind'}),
                df.loc[:,['trans_id', 'prod_id', 'loc', 'ind_any']].rename(columns={'ind_any':'ind'})])

df3 = (df2.loc[:,['prod_id', 'loc', 'ind','trans_id']]
     .groupby(['loc', 'prod_id', 'ind'])
     .count()
     .unstack(level=[1,2])
     .fillna(0)
     .sort_index(axis=1))
print df3

Выход:

        trans_id                                              
prod_id  thing_1         thing_2               thing_3        
ind        ind_1 ind_any   ind_1 ind_2 ind_any   ind_2 ind_any
loc                                                           
place_1      2.0     2.0     1.0   0.0     1.0     0.0     0.0
place_2      0.0     0.0     0.0   0.0     0.0     1.0     1.0
place_3      0.0     0.0     0.0   1.0     1.0     0.0     0.0
...