Как кросс-таблица Pandas отличается от Pandas pivot_table?

Оба pandas.crosstab и сводная таблица Pandas, похоже, обеспечивают точно такую ​​же функциональность. Существуют ли какие-либо различия?

Ответ 1

Основное различие между ними заключается в том, что pivot_table ожидает, что ваши входные данные уже будут в виде DataFrame; вы передаете DataFrame в pivot_table и указываете index/columns/values, передавая имена столбцов в виде строк. С cross_tab вам необязательно включать DataFrame, поскольку вы просто передаете объекты, похожие на массивы, для index/columns/values.

Глядя на исходный код для crosstab, он, по сути, принимает передаваемые вами объекты, похожие на массивы, создает DataFrame, а затем вызывает pivot_table соответствующим образом.

В общем, используйте pivot_table, если у вас уже есть DataFrame, чтобы у вас не было дополнительных затрат на создание того же DataFrame снова. Если вы начинаете с массивоподобных объектов и заинтересованы только в поворотных данных, используйте crosstab. В большинстве случаев, я не думаю, что будет действительно иметь значение, какую функцию вы решите использовать.

Ответ 2

То же самое, если в pivot_table использовать aggfunc=len и fill_value=0:

pd.crosstab(df['Col X'], df['Col Y'])
pd.pivot_table(df, index=['Col X'], columns=['Col Y'], aggfunc=len, fill_value=0)

РЕДАКТИРОВАТЬ: Существует большая разница:

По умолчанию aggfunc разные: pivot_table - np.mean, crosstab - len.

Параметр margins_name находится только в pivot_table.

В pivot_table вы можете использовать Grouper для index и columns ключевых слов.


Я думаю, если вам нужна просто таблица частот, функция crosstab лучше.

Ответ 3

К сожалению, у pivot_table нет аргумента normalize.

В crosstab аргумент normalize вычисляет проценты путем деления каждой ячейки на сумму ячеек, как описано ниже:

  • normalize = 'index' делит каждую ячейку на сумму ее строки
  • normalize = 'columns' делит каждую ячейку на сумму столбца
  • normalize = True делит каждую ячейку на сумму всех ячеек в таблице