Вы хотите сделать кросс-табуляцию двух факторов (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