Python 计算高维交叉表中的百分比

Python 计算高维交叉表中的百分比,python,pandas,crosstab,Python,Pandas,Crosstab,我对3个变量(位置,报价,组)做了一个交叉表。我如何计算1个变量offer的总和的百分比,而不是边距(即按列标准化) df 我当前的交叉表: position left right All offer accept reject accept reject group1 2 0 0 3 5 group

我对3个变量(
位置
报价
)做了一个
交叉表。我如何计算1个变量
offer
的总和的百分比,而不是边距(即按列标准化)

df

我当前的交叉表:

 position         left                 right          All
 offer          accept   reject    accept   reject        
 group1         2         0           0       3       5
 group2         0         1           1       2       4
 group3         1         0           1       0       2
 All            3         1           2       5       11
预期成果:

 position         left                 right
 offer          accept   reject    accept   reject       
 group1            1       0         0        1 
 group2            0       1         0.33     0.66  
 group3            1       0         1        0  

谢谢

添加另一个步骤,
groupby
沿着列的第0级,并将
c
除以
总和

c = pd.crosstab(df.group, [df.position, df.offer])
df = c / c.groupby(level=0, axis=1).sum()
print(df)

position   left            right          
offer    accept reject    accept    reject
group                                     
group1      1.0    0.0  0.000000  1.000000
group2      0.0    1.0  0.333333  0.666667
group3      1.0    0.0  1.000000  0.000000

如果你和我一样是一个完美主义者,你可能想要整数,你可以这样做:

df = c.div(c.groupby(level=0, axis=1).sum()).astype(object)
print(df)

position   left            right          
offer    accept reject    accept    reject
group                                     
group1        1      0         0         1
group2        0      1  0.333333  0.666667
group3        1      0         1         0
你可以用

In [4013]: dfa = df.groupby(['group', 'position', 'offer']).size().unstack(fill_value=0)

In [4014]: dfa.div(dfa.sum(axis=1), axis=0).unstack()
Out[4014]:
offer    accept           reject
position   left     right   left     right
group
group1      1.0  0.000000    0.0  1.000000
group2      0.0  0.333333    1.0  0.666667
group3      1.0  1.000000    0.0  0.000000

您还可以从
pivot\u表中获得
dfa

df.pivot_table(index=['group', 'position'], columns='offer', aggfunc=len)['pid']

df
看起来像什么?@COLDSPEED,我怎样才能按多个级别分组<代码>groupby([level=0,level=1],axis=1)
似乎不起作用。谢谢@Kay
groupby(级别=[0,1],轴=1)
In [4013]: dfa = df.groupby(['group', 'position', 'offer']).size().unstack(fill_value=0)

In [4014]: dfa.div(dfa.sum(axis=1), axis=0).unstack()
Out[4014]:
offer    accept           reject
position   left     right   left     right
group
group1      1.0  0.000000    0.0  1.000000
group2      0.0  0.333333    1.0  0.666667
group3      1.0  1.000000    0.0  0.000000
df.pivot_table(index=['group', 'position'], columns='offer', aggfunc=len)['pid']