PythonPandas:pivot_表计数,用于同一级别上的多个列?

PythonPandas:pivot_表计数,用于同一级别上的多个列?,python,pandas,numpy,pivot-table,Python,Pandas,Numpy,Pivot Table,我有一个熊猫数据框,具有以下总体布局(虚拟数据): 我可以用以下布局轻松创建pivot_表: 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 不幸的是,我不能将单独完成的结果连接在一起,因为它们需要为最终输出正确排序。

我有一个熊猫数据框,具有以下总体布局(虚拟数据):

我可以用以下布局轻松创建pivot_表:

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
不幸的是,我不能将单独完成的结果连接在一起,因为它们需要为最终输出正确排序。任何提示或技巧都将不胜感激

编辑:

        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
以下是我希望使用虚拟数据的理想输出格式:

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
       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

向我们显示您的代码,或者您期望的代码output@Wen我已经添加了预期的输出,并将在有机会时为虚拟数据添加适应的代码。谢谢你为什么不能,你的索引是loc,这正是concat的问题。不幸的是,我必须有“ind_1,ind_2,ind_any”的确切顺序。结果太大,无法手动修复输出。带有“place_1”、“thing1”和“ind1”的条目重复。你希望如何解决这个问题?如果我理解正确,您希望trans_id是所需输出中的值?有没有简单的方法来添加百分比?