我有一个这样的数据框,所有分类值:

col1    col2
0   A   x
1   A   y
2   A   x
3   A   z
4   A   z
5   A   z
6   B   x
7   B   y
8   B   x


我想将其按“ col1”分组,并获得在不同列中获得“ col2”值的时间百分比。喜欢:

    col1    x    y       z
0   A     33.33  16.67   50.0
1   B     66.67  33.37   0.0


我尝试了数据透视表,该数据透视表仅给我列的每个值的计数,但是如何以百分比的形式获取呢?

提前致谢。

最佳答案

您想对两个因子(col1col2)进行交叉制表,并将每行的频率归一化。为此,您可以在pd.crosstab()设置为normalize的情况下使用index

>> df = pd.DataFrame({'col1': list('aaaaaabbb'), 'col2': list('xyxzzzxyx')})
>> pd.crosstab(df['col1'], df['col2'], normalize='index') * 100
col2    x           y           z
col1
a       33.333333   16.666667   50.0
b       66.666667   33.333333   0.0


如果要使用多个因素,只需调用crosstab并列出一系列因素:

>> df['col3'] = list('112231345')
>> pd.crosstab([df['col1'], df['col3']], df['col2'], normalize='index') * 100
        col2    x           y           z
col1    col3
a       1       33.333333   33.333333   33.333333
        2       50.000000   0.000000    50.000000
        3       0.000000    0.000000    100.000000
b       3       100.000000  0.000000    0.000000
        4       0.000000    100.000000  0.000000
        5       100.000000  0.000000    0.000000


如果您想四舍五入,只需致电round

>> round(pd.crosstab(df['col1'], df['col2'], normalize='index') * 100, 2)
col2    x       y       z
col1
a       33.33   16.67   50.0
b       66.67   33.33   0.0

关于python - 将分类数据转换为 Pandas 中的数字百分比,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53556031/

10-14 20:22
查看更多