san*_*oku 2 python pivot percentage pandas
对于这个简单的枢轴,如何将值转换为行的百分比,以及列的百分比?
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)
Run Code Online (Sandbox Code Playgroud)
不知何故,经过一番搜索,我没有找到这个简单问题的答案。
预期结果(如果获得列的百分比)
A B C
ONE 50% 24% 50%
THREE 13% 31% 42%
TWO 36% 45% 8%
Run Code Online (Sandbox Code Playgroud)
谢谢
您可以使用以下命令获得所需的输出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')
Run Code Online (Sandbox Code Playgroud)
这应该产生:
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
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令重新格式化输出以显示百分之一的百分比applymap:
pd.crosstab(df.A, df.B,values=df.C,aggfunc=np.sum,normalize='columns').applymap(lambda x: "{0:.0f}%".format(100*x))
Run Code Online (Sandbox Code Playgroud)
这应该产生:
B A B C
A
one 50% 23% 50%
three 17% 32% 42%
two 33% 45% 8%
Run Code Online (Sandbox Code Playgroud)
如果该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))
Run Code Online (Sandbox Code Playgroud)
我希望这有用。
这会给你想要的结果
df = pd.pivot_table(df, index='A', columns='B', values = 'C', aggfunc=sum).apply(lambda x:100 * x / float(x.sum())).round(2)
Run Code Online (Sandbox Code Playgroud)
我已将其作为单衬完成,但您可以分解支点并应用
你得到
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
Run Code Online (Sandbox Code Playgroud)