如何为具有行标题和列标题的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
。谢谢。申请成功了。不知何故,他们无法升级熊猫