我有一个具有以下常规布局的熊猫数据框(虚拟数据):

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_1或ind_2”相同的级别上包括“ ind_any”的其他计数,如下所示:

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


我将使我的实际代码适应虚拟数据,并在有机会时提供

最佳答案

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

关于python - Python PANDAS:pivot_table在同一级别上是否包含多个列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50223432/

10-10 10:29