计算相对于整个 table 的百分比
calculate percentage relative to entire table
我想根据整个 table 的总和来计算百分比,而不仅仅是 pandas table 和 python 中的行或列。我可以分别按行和按列来做,但我宁愿做整个 table。欢迎提出任何建议。非常感谢
数据
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')
每个row/col
的命令
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
,可以直接将交叉table除以总和
ctdf = pd.crosstab(df1.band, [df1.place, df1.status])
ctdf / ctdf.sum().sum()
>>>
place north south
status green red green red
band
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()
最后,您还可以在单个方法链中使用 pipe
(而不是 apply
):
pd.crosstab(df1.band, [df1.place, df1.status]).pipe(lambda x: x / x.values.sum())
我想根据整个 table 的总和来计算百分比,而不仅仅是 pandas table 和 python 中的行或列。我可以分别按行和按列来做,但我宁愿做整个 table。欢迎提出任何建议。非常感谢
数据
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')
每个row/col
的命令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
,可以直接将交叉table除以总和
ctdf = pd.crosstab(df1.band, [df1.place, df1.status])
ctdf / ctdf.sum().sum()
>>>
place north south
status green red green red
band
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()
最后,您还可以在单个方法链中使用 pipe
(而不是 apply
):
pd.crosstab(df1.band, [df1.place, df1.status]).pipe(lambda x: x / x.values.sum())