我有一个具有以下常规布局的熊猫数据框(虚拟数据):
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/