web-dev-qa-db-ja.com

Pandasクロス集計とPandas pivot_tableはどう違うのですか?

Pandas.crosstabとPandasピボットテーブルの両方がまったく同じ機能を提供しているようです。違いはありますか?

17
user1008537

2つの主な違いは、pivot_tableは入力データがすでにDataFrameであると想定していることです。 DataFrameをpivot_tableに渡し、列名を文字列として渡すことでindex/columns/valuesを指定します。 cross_tabでは、index/columns/valuesに配列のようなオブジェクトを渡すだけなので、必ずしもDataFrameを使用する必要はありません。

crosstabの-​​ ソースコード を見ると、基本的に、渡した配列のようなオブジェクトを受け取り、DataFrameを作成してから、必要に応じてpivot_tableを呼び出します。

一般に、すでにDataFrameがある場合はpivot_tableを使用して、同じDataFrameを再度作成するという追加のオーバーヘッドが発生しないようにします。配列のようなオブジェクトから始めて、ピボットされたデータのみに関心がある場合は、crosstabを使用します。ほとんどの場合、実際にどの機能を使用するかを決定することはないと思います。

24
root

pivot_table の場合、同じですか?aggfunc=lenfill_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.meancrosstab -len

パラメータmargins_namepivot_tableにのみあります。

pivot_tableでは、Grouperおよびindexキーワードにcolumnsを使用できます。


頻度表が必要なだけなら、crosstab関数の方がいいと思います。

14
jezrael

pivot_tableには、残念ながらnormalize引数がありません。

crosstabnormalize引数は、以下に説明するように、各セルをセルの合計で除算してパーセンテージを計算します。

  • normalize = 'index'各セルをその行の合計で割ります
  • normalize = 'columns'各セルをその列の合計で割ります
  • normalize = True各セルを表のすべてのセルの合計で割ります
1
yzerman