Python 计算相对于整个表的百分比

Python 计算相对于整个表的百分比,python,pandas,crosstab,Python,Pandas,Crosstab,我想根据整个表的总数来计算百分比,而不仅仅是使用python的pandas表中的行或列。我可以分别按行和按列进行,但我更喜欢整张表。欢迎提出任何建议。非常感谢 数据 df1 = pd.DataFrame(data={'id': [1,2,3,4,5,6,7,8,9,10], 'place': [1,1,2,2,2,1,1,2,1,1], 'band': [1,2,3,3,3,2,1,2,3,1], 'status': [1,2,2,1,1,1,1,2,1,2]}) d1={1: 'north'

我想根据整个表的总数来计算百分比,而不仅仅是使用python的pandas表中的行或列。我可以分别按行和按列进行,但我更喜欢整张表。欢迎提出任何建议。非常感谢

数据

df1 = pd.DataFrame(data={'id': [1,2,3,4,5,6,7,8,9,10], 'place': [1,1,2,2,2,1,1,2,1,1], 'band': [1,2,3,3,3,2,1,2,3,1], 'status': [1,2,2,1,1,1,1,2,1,2]})

d1={1: 'north', 2: 'south'} 
d2={1: '10-20', 2: '30-40', 3: '20-30'} 
d3={1: 'green', 2: 'red'} 

df1['place']=df1['place'].map(d1).fillna('Other')
df1['band']=df1['band'].map(d2).fillna('Other')
df1['status']=df1['status'].map(d3).fillna('Other')
每行/列的命令

pd.crosstab(df1.band, [df1.place, df1.status]).apply(lambda r: r/r.sum(), axis=1).round(2) #  by row 
pd.crosstab(df1.band, [df1.place, df1.status]).apply(lambda r: r/r.sum(), axis=0).round(2) #  by column

如果您不必在单个
apply
中执行此操作,您只需将交叉表除以总和即可

ctdf=pd.crosstab(df1.band、[df1.place、df1.status])
ctdf/ctdf.sum().sum()
>>>
南北广场
状态绿-红-绿-红
乐队
10-20   0.2     0.1 0.0     0.0
20-30   0.1     0.0 0.2     0.1
30-40   0.1     0.1 0.0     0.1
另一种选择(由@Shubham Sharma评论)是使用
ctdf.values.sum()

最后,您还可以在单个方法链中使用
管道
(而不是
应用
):

pd.crosstab(df1.band、[df1.place、df1.status]).pipe(lambda x:x/x.values.sum())
我们也可以使用
ctdf.values.sum()来代替
ctdf.sum().sum()