Как сделать кросс-таблицу pandas с процентами?

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

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24)}) pd.crosstab(df.A,df.B) BABC A one 4 4 4 three 2 2 2 two 2 2 2 

Использование параметра полей в кросс-таблице для вычисления итогов строк и столбцов приближает нас к мысли, что это должно быть возможно с помощью aggfunc или groupby, но мой скудный мозг не может это продумать.

 BABC A one .33 .33 .33 three .33 .33 .33 two .33 .33 .33 

4 Solutions collect form web for “Как сделать кросс-таблицу pandas с процентами?”

 pd.crosstab(df.A, df.B).apply(lambda r: r/r.sum(), axis=1) 

В основном у вас есть функция, которая выполняет row/row.sum() , и вы используете apply с axis=1 чтобы применить ее по строке.

(Если вы делаете это в Python 2, вы должны использовать from __future__ import division чтобы деление всегда возвращало float.)

Начиная с версии Pandas 0.18.1, есть вариант normalize :

 In [1]: pd.crosstab(df.A,df.B, normalize='index') Out[1]: BABC A one 0.333333 0.333333 0.333333 three 0.333333 0.333333 0.333333 two 0.333333 0.333333 0.333333 

Где вы можете нормализовать all или all , index (строки) или columns .

Более подробная информация содержится в документации .

Если вы ищете процент от общего количества, вы можете разделить на len df вместо суммы строки:

 pd.crosstab(df.A, df.B).apply(lambda r: r/len(df), axis=1) 

Другой вариант – использовать div, а не применять:

 In [11]: res = pd.crosstab(df.A, df.B) 

Разделите на сумму по индексу:

 In [12]: res.sum(axis=1) Out[12]: A one 12 three 6 two 6 dtype: int64 

Как и выше, вам нужно что-то сделать для целочисленного деления (я использую astype ('float')):

 In [13]: res.astype('float').div(res.sum(axis=1), axis=0) Out[13]: BABC A one 0.333333 0.333333 0.333333 three 0.333333 0.333333 0.333333 two 0.333333 0.333333 0.333333 
  • Pandas to_csv () медленное сохранение большого кадра данных
  • Кажется, что Pandas игнорирует имя первого столбца при чтении данных с разделителями-табуляторами, дает KeyError
  • Извлечь DataFrame для всех, кроме одного указанного столбца
  • Могу ли я окрасить разные месяцы?
  • Обозначенные типы данных Python
  • Как вы складываете два столбца Pandas Dataframe друг на друга?
  • Python Pandas Как назначить результаты операции groupby обратно в столбцы в родительском фрейме?
  • Редактировать HTML, вставляя ссылку на CSS
  • Python - лучший язык программирования в мире.