こんにちは!インストラクターのフクロウです!この記事では、pandas.DataFrameの要素をグルーピングする事ができるGroupByを解説します。
あるDataFrameを、任意の条件でいくつかの小さなDataFrameに分割してそれぞれに対して演算したい、ということがあります。こんな時、GroupByを使うと簡単にそれが実現できますよ!
開発環境
この記事を書くために使った開発環境は以下のとおりです。
- OS=”Ubuntu 18.04.1 LTS”
- Python 3.7.0
- Pandas 0.23.4
OSが異なっても基本的には同じ操作で記事中のプログラムは再現できるので、試してみてください!
groupbyの使い方
[前準備]DataFrameの作成
まずライブラリをimportしておきましょう。そして機械学習ライブラリsklearnからiris datasetsを読み込んで、DataFrameを作ります。
import pandas as pd
import numpy as np
from sklearn import datasets
# sklearnからデータセットを読み込みます
iris = datasets.load_iris()
# データセットからDataFrameを作成します。ここでは列が特徴になっていて、クラスをlabel列として追加しておきます。
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df["label"] = [iris.target_names[i] for i in iris.target]
df.head()
groupbyメソッドの使い方
groupbyは特定の列の値ごとにグループを作成することができます。グループごとに統計量を計算するなどの使い方ができます。
例えば、label列の要素は全部で3つ、[setosa,versicolor,virginica]です。この3つのグループを一つのDataFrameから作成して、それぞれに対してmaxやstd、sumなどの関数を適用できます。
df.groupby("label")
groupbyで作ったグループは、pandasの特殊なオブジェクトになっているのでprintして中身を確認することができません。ですがちゃんとそれぞれをDataFrameとして扱い、計算ができるので確かめてみましょう。
groupbyを使ったグループごとの計算
# グループごとに合計値を出す
df.groupby("label").sum()
# グループごとに分散を出す
df.groupby("label").var()
出力される結果はグループの分だけ行があり、それぞれのグループで計算ができていることがわかります。さらに、統計量の計算はdescribeメソッドを使えば一発で一覧が出せます。これもgroupbyで使えるので試してみましょう。
# グループごとに統計量一覧を出す
df.groupby("label").describe().T
groupbyを使ったグループごとの可視化
可視化もいけます!plotメソッドで個別にプロットしてみましょう。
df.groupby("label").plot(kind="scatter", # 散布図を作成
x=0, y=1) # x軸とy軸を指定
まとめ
この記事では、DataFrameの要素を内部でグルーピングするメソッド、groupbyを紹介しました。
groupbyの要点
- groupbyはDataFrameのメソッド
- groupbyでDataFrameの要素を列の値を使ってグルーピングできる
- 統計量やプロットをグループごとに出力できる
groupbyを使えばloc/ilocなどを使ってスライスしなくても、手軽にDataFrameを分割できます。データの全体像を見るのに非常に便利な機能です。ぜひ使ってみてください。