@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
您仍然需要做一些小的格式化工作(翻转第一列和第二列并转换为%),但这些是您正在寻找的数字。
顺便说一句,这里没有必要,但您可能想考虑将“时间”转换为有序分类变量,这将是解决列排序问题的一种方法(我认为),但可能值得也可能不值得麻烦,具体取决于关于您对数据还做了什么。