Оба pandas.crosstab и сводная таблица Pandas, похоже, обеспечивают точно такую же функциональность. Существуют ли какие-либо различия?
Как кросс-таблица Pandas отличается от Pandas pivot_table?
Ответ 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делит каждую ячейку на сумму всех ячеек в таблице