Python/Pandas 将数据透视表 table 转换为基于行总数的百分比
Python/Pandas convert pivot table into percentages based on row total
我认为这应该很简单,但在 Python 中,我只是想不出如何使用数据透视表 table 并根据行总计获得百分比。
枢轴Table:
df.pivot_table(index='Name', columns='scenario',
values='y', aggfunc=np.count_nonzero, margins=True, margins_name='Total').fillna(0)
其中得到:
但我想要的是每个单元格除以行总数:
我该怎么做?提前谢谢你。
- 您可以结合使用
.pipe
方法和 .div
对所有列执行此 column-wise 除法。
- 然后您可以使用
.applymap
将字符串格式应用于每个值,以使值显示为百分比(请注意,它们变成字符串并且在数学上不再有用)
out = (
df.pivot_table(
index='Name', columns='scenario', values='y',
aggfunc=np.count_nonzero, margins=True,
margins_name='Total', fill_value=0
)
.pipe(lambda d: d.div(d['Total'], axis='index'))
.applymap('{:.0%}'.format)
)
例子
df = pd.DataFrame({
'a': [1, 0, 0, 1, 5],
'b': [20, 20, 10, 50, 15],
'c': [50, 20, 50, 100, 20]
})
print(df)
a b c
0 1 20 50
1 0 20 20
2 0 10 50
3 1 50 100
4 5 15 20
out = (
df.pipe(lambda d: d.div(d['c'], axis='index'))
.applymap('{:.0%}'.format)
)
print(out)
a b c
0 2% 40% 100%
1 0% 100% 100%
2 0% 20% 100%
3 1% 50% 100%
4 25% 75% 100%
我认为这应该很简单,但在 Python 中,我只是想不出如何使用数据透视表 table 并根据行总计获得百分比。
枢轴Table:
df.pivot_table(index='Name', columns='scenario',
values='y', aggfunc=np.count_nonzero, margins=True, margins_name='Total').fillna(0)
其中得到:
但我想要的是每个单元格除以行总数:
我该怎么做?提前谢谢你。
- 您可以结合使用
.pipe
方法和.div
对所有列执行此 column-wise 除法。 - 然后您可以使用
.applymap
将字符串格式应用于每个值,以使值显示为百分比(请注意,它们变成字符串并且在数学上不再有用)
out = (
df.pivot_table(
index='Name', columns='scenario', values='y',
aggfunc=np.count_nonzero, margins=True,
margins_name='Total', fill_value=0
)
.pipe(lambda d: d.div(d['Total'], axis='index'))
.applymap('{:.0%}'.format)
)
例子
df = pd.DataFrame({
'a': [1, 0, 0, 1, 5],
'b': [20, 20, 10, 50, 15],
'c': [50, 20, 50, 100, 20]
})
print(df)
a b c
0 1 20 50
1 0 20 20
2 0 10 50
3 1 50 100
4 5 15 20
out = (
df.pipe(lambda d: d.div(d['c'], axis='index'))
.applymap('{:.0%}'.format)
)
print(out)
a b c
0 2% 40% 100%
1 0% 100% 100%
2 0% 20% 100%
3 1% 50% 100%
4 25% 75% 100%