gpt4 book ai didi

python - Pandas 数据透视表 : Percentage of row calculation for non-numeric values

转载 作者:太空狗 更新时间:2023-10-30 00:49:18 24 4
gpt4 key购买 nike

这是我在数据框“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)

但我想要的是当您右键单击数据透视表并选择“将值显示为 -> % of Row Total”时在 Excel 数据透视表中计算的行百分比。由于我的文档是一个非数字值,所以我无法获取它。

预期结果:

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

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

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

关于python - Pandas 数据透视表 : Percentage of row calculation for non-numeric values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31064752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com