Оба 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
делит каждую ячейку на сумму всех ячеек в таблице