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

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

グループ化したいカラム名(のリスト)と集計したいカラム名(のリスト)を指定して、データを集計できます。 groupbyで返ってくるオブジェクトは(型名を確認して追記する)型になっています。 そのままでは扱いづらいので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# あとのデータ処理のためwカラム名を変更する
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の引数に辞書を指定できることを認識していませんでした。 もしかしたら、こんな回りくどいことをせずに計算できるかもしれません。

リファレンス