グループ化したい(pandas.DataFrame.groupby

1g = ["グループ化したいカラム名"]
2v = ["集計したいカラム名"]
3
4data.groupby(g)[v].sum().reset_index()

groupbyで、データを指定したカラムの値でグループ化し、それぞれのグループに対して集計できます。 グループ化したいカラム名(のリスト)と 集計したいカラム名(のリスト)を指定して、データフレームを集計します。

groupbyの結果はDataFrameGroupBy型になっているため、 .sum().mean()などの集計関数を適用する必要があります。

また、集計結果はグループ化したカラムがインデックスになるため、 .reset_index()して通常のデータフレームに変換することが多いです。

パーセンテージを計算したい

1g = "グループ化したいカラム名"
2v = "集計したいカラム名"
3grouped = data.groupby(g)[v].count().reset_index()
4
5# 集計したカラムの総計を計算
6n = grouped[v].sum()
7grouped["percentage"] = grouped[v] / n

集計した値の割合を計算しています。 集計したカラムの総計で、グループごとの集計値を割り算しています。

平均値と標準偏差したい(pandas.DataFrame.agg

1grouped = data.groupby(g)[v].agg(["mean", "std"]).reset_index()

pd.DataFrame.aggの引数にはリスト(や辞書)も設定できます。 meanstdを与えると平均値と標準偏差をまとめて取得できます。

複数の方法で集計したい

 1# グループ化したいカラム
 2group: list[str] = ["グループ化したいカラム"]
 3
 4# 集計項目
 5# ページビュー数, セッション数
 6v = ["pageview", "session"]
 7# ユニークビジター数(=同一IPアドレスの数)
 8u = "uvisitor"
 9
10# あとのデータ処理のためカラム名を変更する
11data.rename(columns={"ipaddress": u}, inplace=True)
12
13# 1次集計
14g = group + [u]
15grouped = data.groupby(group)[v].sum().reset_index()
16
17# 2次集計
18_left = grouped.groupby(group)[v].sum().reset_index()
19_right = grouped.groupby(group)[u].count().reset_index()
20insight = pd.merge(_left, _right, on=group)

あるカラム(のリスト)は合計値、 別のカラム(のリスト)はカウント値、のように、 複数の方法で集計したい場合です。

1回の操作で完結させることができないので、 まずグループ化したいカラム名ごとにgroupbyして集計したデータフレームを作成し、それから、グループ化したいカラム名を基準にしてマージ(pandas.merge)しています。

上のサンプルでは、pageviewsessionのカラムは合計値(sum)、 uvisitorのカラムはカウント数(count)で集計しています。

注釈

このコードを書いたときは、pd.DataFrame.aggの引数に辞書を指定できることを認識していませんでした。 もしかしたら、こんな回りくどいことをせずに計算できるかもしれません。

 1# グループ化したいカラム
 2group: list[str] = ["グループ化したいカラム"]
 3
 4# あとのデータ処理のためカラム名を変更する
 5data.rename(columns={"ipaddress": "uvisitor"}, inplace=True)
 6
 7# 集計方法を定義
 8aggregation_rules = {
 9    "pageview": "sum",
10    "session": "sum",
11    "uvisitor": "count",
12}
13
14# 集計
15insight = data.groupby(group).agg(aggregation_rules).reset_index()
16
17# カラム名をわかりやすく
18columns = {
19    "pageview": "total_pageview",
20    "session": "total_session",
21    "uvisitor": "unique_visitor",
22}
23insight.rename(columns=columns, inplace=True)

リファレンス