Конвертировать Категориальные данные в числовой процент в Пандах - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть такой фрейм данных, все категориальные значения:

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

Я пробовал сводную таблицу, которая дает мне только счетчик каждого значения столбца, но как получить его в процентах?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Вы хотите сделать кросс-табуляцию двух факторов (col1 и col2) с частотой, нормализованной по каждой строке.Для этого вы можете использовать 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
...