Python 计算高维交叉表中的百分比
我对3个变量(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
位置
,报价
,组
)做了一个交叉表。我如何计算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)
似乎不起作用。谢谢@Kaygroupby(级别=[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']