在 Pandas 中将分类数据转换为数字百分比

Posted

技术标签:

【中文标题】在 Pandas 中将分类数据转换为数字百分比【英文标题】:Convert Categorical data to numeric percentage in Pandas 【发布时间】:2019-05-02 12:29:26 【问题描述】:

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

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

我尝试了数据透视表,它只给我列的每个值的计数,但如何以百分比形式获得它?

提前致谢。

【问题讨论】:

Sort a Dataframe and count a value with percentages的可能重复 【参考方案1】:

您希望对两个因子(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

【讨论】:

感谢您的快速帮助。我正在尝试数据透视表并尝试创建一个 lambda 函数。 np!如果它解决了您的问题,请不要忘记接受答案:) 如何将 2 列作为索引?

以上是关于在 Pandas 中将分类数据转换为数字百分比的主要内容,如果未能解决你的问题,请参考以下文章

在 Python pandas 中将带有 $ 的货币转换为数字

如何在 R 中将分类变量转换为连续变量?

在python pandas df中将月份数转换为名称

如何在熊猫中将 4 位数字转换为小时:分钟时间格式

将 pandas 字符串数据转换为决策树的数字

在 Pandas 中将每日数据转换为每周数据