对于这个简单的数据透视,如何将值转换为行的%,同样转换为列的%?
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%
由于
答案 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')