Pandas Pivot_Table : 非数字值的行百分比计算[英] Pandas Pivot_Table : Percentage of row calculation for non-numeric values

本文是小编为大家收集整理的关于Pandas Pivot_Table : 非数字值的行百分比计算的处理方法,想解了Pandas Pivot_Table : 非数字值的行百分比计算的问题怎么解决?Pandas Pivot_Table : 非数字值的行百分比计算问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这是我在数据框"df"中的数据:

Document    Name    Time
SPS2315511  A   1 HOUR
SPS2315512  B   1 - 2 HOUR
SPS2315513  C   2 - 3 HOUR
SPS2315514  C   1 HOUR
SPS2315515  B   1 HOUR
SPS2315516  A   2 - 3 HOUR
SPS2315517  A   1 - 2 HOUR

我正在使用下面的代码,它为我提供了数据透视表中的计数摘要,

table = pivot_table(df, values=["Document"],
                    index=["Name"], columns=["Time"],
                    aggfunc=lambda x: len(x),
                    margins=True, dropna=True)

但我想要的是当您右键单击数据透视并选择"将值显示为 -> 行总计百分比"时,excel 数据透视表中的行计算百分比.由于我的 Document 是一个非数字值,我无法得到它.

预期结果:

Count of Document   Column Labels

Name    1 HOUR  1 - 2 HOUR  2 - 3 HOUR  Grand Total
A   33.33%  33.33%  33.33%  100.00%
B   50.00%  50.00%  0.00%   100.00%
C   50.00%  0.00%   50.00%  100.00%
Grand Total 42.86%  28.57%  28.57%  100.00%

谁能帮我想办法得到这个结果?

我正在尝试操作数据透视数据,这将为我提供总行数,而不是数据框中的数据,我想要的是"行总百分比".而且最重要的是,我所有的数据都是非数值......

推荐答案

@maxymoo 指出的可能重复的问题非常接近解决方案,但我会继续写下来作为答案,因为有几个不完全直截了当的差异.

table = pd.pivot_table(df, values=["Document"],
                       index=["Name"], columns=["Time"], 
                       aggfunc=len, margins=True, 
                       dropna=True, fill_value=0)

       Document                      
Time 1 - 2 HOUR 1 HOUR 2 - 3 HOUR All
Name                                 
A             1      1          1   3
B             1      1          0   2
C             0      1          1   2
All           2      3          2   7

主要的调整是添加 fill_value=0 因为你真正想要的是计数值为零,而不是 NaN.

然后你基本上可以使用@maxymoo 链接到的解决方案,但你需要使用 iloc 或类似的 b/c 表列现在有点复杂(作为数据透视表的多索引结果).

table2 = table.div( table.iloc[:,-1], axis=0 )

       Document                         
Time 1 - 2 HOUR    1 HOUR 2 - 3 HOUR All
Name                                    
A      0.333333  0.333333   0.333333   1
B      0.500000  0.500000   0.000000   1
C      0.000000  0.500000   0.500000   1
All    0.285714  0.428571   0.285714   1

您仍然需要进行一些小的格式化工作(翻转第一列和第二列并转换为 %),但这些是您要查找的数字.

顺便说一句,这里没有必要,但您可能想考虑将"时间"转换为有序分类变量,这将是解决列排序问题的一种方法(我认为),但可能值得也可能不值得麻烦取决于您对数据所做的其他事情.

本文地址:https://www.itbaoku.cn/post/1728051.html