グループ集計したい(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
の引数にはリスト(や辞書)も設定できます。
mean
とstd
を与えると平均値と標準偏差をまとめて取得できます。
複数の方法で集計したい
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
)しています。
上のサンプルでは、pageview
とsession
のカラムは合計値(sum
)、
uvisitor
のカラムはカウント数(count
)で集計しています。
注釈
このコードを書いたときは、pd.DataFrame.agg
の引数に辞書を指定できることを認識していませんでした。
もしかしたら、こんな回りくどいことをせずに計算できるかもしれません。