如何计算具有行标题和列标题的python枢轴的行%和列百分比?

时间:2017-02-21 15:37:07

标签: 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)

经过一番搜索,我找不到这个简单问题的答案。

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

      A   B  C
ONE   50% 24% 50%
THREE 13% 31% 42%
TWO  36% 45% 8%

由于

3 个答案:

答案 0 :(得分:2)

这将为您提供所需的结果

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

答案 1 :(得分:1)

使用pd.crosstab

可以获得所需的输出
import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
                   'B' : ['A', 'B', 'C'] * 4,
               'C' : range(12)})

pd.crosstab(df.A, df.B, values=df.C, aggfunc=np.sum, normalize='columns')

这应该产生:

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

您可以重新格式化输出以使用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    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))

我希望这证明有用。

答案 2 :(得分:0)

借助pandas.crosstab,您可以轻松实现所需的服务。

请注意,规范化可以是关于所需内容的列还是行。

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