クロス集計したい(pandas.crosstab

1pd.crosstab(data["カラムA"], data["カラムB"])

pd.crosstabで使ってクロス集計できます。 クロス集計すると、指定した2つのカテゴリカルデータ(離散変数)の頻度を確認できます。 トップレベルのメソッドなので、引数にはデータフレーム(というかpd.Series)を指定します。 デフォルトでdropna=Trueとなっていて、すべての値がNaNのカラムは除外されます。

 1table = pd.crosstab(data["q01"], data["q02"])
 2
 3print(table)
 4q02	Male	Female
 5q01
 620s	67	35
 730s	52	34
 840s	26	11
 950s	25	5
1060s	16	3
1170s	5	0
1280s	2	0

上記はアンケート結果を集計したときのサンプルです。 回答者の年代(q01)と性別(q02)で集計しています。

注釈

pd.crosstabで得られたデータフレームの並びを確認すると、 行方向がq02、列方向がq01となっています。 与えた引数の順番と逆になるので、クロス集計結果からヒートマップにする時は転置(.T)する必要があります。

小計したい(margins / margins_name

1pd.crosstab(data["カラムA"], data["カラムB"], margins=True)
2pd.crosstab(data["カラムA"], data["カラムB"], margins=True, margins_name="小計")

列と行の末尾にそれぞれの小計を追加できます。 margins_nameで小計したカラムの名前を設定できます。デフォルトはAllです。 人間が確認するためのデータの場合、追加しておくとよいと思います。

規格化したい(normalize

1pd.crosstab(data["カラムA"], data["カラムB"], normalize=True)
2
3# 行ごとの小計で規格化
4pd.crosstab(data["カラムA"], data["カラムB"], normalize="index")
5
6# 列ごとの小計で規格化
7pd.crosstab(data["カラムA"], data["カラムB"], normalize="columns")

全体の合計値でクロス集計表を規格化できます。 また、列ごとの小計(columns)もしくは行ごとの小計(index)でも規格化できます。 規格化したい基準が合っているかどうかはmargins=Trueオプションで確認できます。

平均値したい(aggfunc

1# カラムA: 離散変数
2# カラムB: 離散変数
3# カラムC: 連続変数(数値)
4pd.crosstab(data["カラムA"], data["カラムB"], values=data["カラムC"], aggfunc="mean")

数値型のデータを集計したい場合は、valuesaggfuncをセットで指定します。 平均値の他に、合計値(sum)/最大値(max)/中央値(median)/最小値(min)などで集計できます。

リファレンス