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)

其中得到:

但我想要的是每个单元格除以行总数:

我该怎么做?提前谢谢你。

  1. 您可以结合使用 .pipe 方法和 .div 对所有列执行此 column-wise 除法。
  2. 然后您可以使用 .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%