Как сделать кросс-таблицу 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 
  • многопроцессорность в python - совместное использование большого объекта (например, dataframe pandas) между несколькими процессами
  • Строгое расположение участка в Пандах
  • Как дискретировать значения в pandas DataFrame и преобразовывать в двоичную матрицу?
  • Зачем использовать pandas qcut return ValueError: края бина должны быть уникальными?
  • Коалесцирует значения из 2 столбцов в один столбец в кадре данных pandas
  • Как изменить порядок столбцов Pandas?
  • Хранение многомерных массивов в столбцах Pandas DataFrame
  • Pandas и применить функцию для соответствия строке
  • Создайте pandas DataFrame как правильный формат: `DataError: нет числовых типов для агрегирования`
  • нежелательное преобразование типа в pandas.DataFrame.update
  • Удалить строку Pandas DataFrame, где значение столбца <0
  • Python - лучший язык программирования в мире.