如何为具有行标题和列标题的python透视计算行百分比和列百分比?

如何为具有行标题和列标题的python透视计算行百分比和列百分比?,python,pandas,pivot,percentage,Python,Pandas,Pivot,Percentage,对于这个简单的数据透视,如何将值转换为行的%,以及列的% import pandas as pd df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3, 'B' : ['A', 'B', 'C'] * 4, 'C' : range(12)}) pd.pivot_table(df, index='A', columns='B', aggfunc=sum) 不知何故

对于这个简单的数据透视,如何将值转换为行的%,以及列的%

import pandas as pd
df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
                   'B' : ['A', 'B', 'C'] * 4,
               'C' : range(12)})
pd.pivot_table(df, index='A', columns='B', aggfunc=sum)
不知何故,经过一番探索,我找不到这个简单问题的答案

预期结果(如果获得列的百分比)


谢谢

您可以通过以下方式获得所需的输出:

这将产生:

B             A         B         C
A                                  
one    0.500000  0.227273  0.500000
three  0.166667  0.318182  0.423077
two    0.333333  0.454545  0.076923
B        A    B    C
A                   
one    50%  23%  50%
three  17%  32%  42%
two    33%  45%   8%
您可以使用
applymap
重新格式化输出,以百分之一百的形式显示百分比:

pd.crosstab(df.A, df.B,values=df.C,aggfunc=np.sum,normalize='columns').applymap(lambda x: "{0:.0f}%".format(100*x))
这将产生:

B             A         B         C
A                                  
one    0.500000  0.227273  0.500000
three  0.166667  0.318182  0.423077
two    0.333333  0.454545  0.076923
B        A    B    C
A                   
one    50%  23%  50%
three  17%  32%  42%
two    33%  45%   8%
编辑: 如果
normalize
参数不起作用,可以使用
apply
获取百分比:

pd.crosstab(df.A, df.B, values=df.C, aggfunc=np.sum).apply(lambda x: x/x.sum()).applymap(lambda x: "{:.0f}%".format(100*x))

我希望这证明是有用的。

这会给你想要的结果

df = pd.pivot_table(df, index='A', columns='B', values = 'C', aggfunc=sum).apply(lambda x:100 * x / float(x.sum())).round(2)
我已经做了一个内衬,但你可以打破支点和应用

你得到

          A      B       C
  A         
 one    50.00   22.73   50.00
 three  16.67   31.82   42.31
 two    33.33   45.45   7.69
有了它,你可以很容易地得到你需要的东西

请注意,规格化可以根据需要按列或按行进行

pandas.crosstab(index=df['A'],columns=[df['A'], df['B'], df['C']],normalize='columns')
pandas.crosstab(index=df['A'],columns=[df['A'], df['B'], df['C']],normalize='rows')

您希望您的预期输出是什么样的?我已经更新了这个问题,基本上相当于excel显示值占列/行的百分比。Thanksry
pd.crosstab(df.A,df.B,values=df.C,aggfunc=np.sum,normalize='columns')
?谢谢您,先生!但是它返回一个错误TypeError:crosstab()得到了一个意外的关键字参数“normalise”,除了pandas和numpy,我还需要其他包吗?我在Python2上它是
normalize
而不是
normalise
。你在这里似乎使用的是英式拼写,而论点的拼写是美式的(带有
z
)。此外,您只需要
pandas
numpy
就可以了。如果不想使用
numpy
,可以使用
aggfunc=np.sum
切换
aggfunc=sum
。curiouser和curiouser。它也不识别“z”。否则:87 kwargs[new_arg_name]=new_arg_value-->88 return func(*args,**kwargs)89 return wrapper 90 return\u deprecate_kwarg TypeError:crosstab()得到一个意外的关键字参数'normalize',您可能正在使用较旧版本的
pandas
。您是否可以升级机器上安装的
pandas
?您可以对其使用
pip安装-U
。我正在使用版本
0.19.2
。谢谢。申请成功了。不知何故,他们无法升级熊猫