ここではpythonのgroupby関数についてのべます。イテラブルをグループ分けして複数のイテラブルに分割します。key値の変わったタイミングで処理を挟みたいとき(キーブレイク処理)に前もってグループしたり集計処理をおこないたい場合など幅広く使える関数です。
groupby関数とは
イテラブルをキーでグループ毎に分けてイテレータとすることができます。このときイテラブルはキーでソート済みである必要があります。ソート処理についてわからなければ「【Python】sortメソッドとsorted関数」をみてください。
上図のように要素1,要素2,…を持つイテラブルがあります。このイテラブルのキー抽出関数に入力し出力結果のキーでグループ分けします。要素1、要素2のキー抽出関数の結果が値A、要素2のキー抽出関数の結果が値B、要素4,要素5のキー抽出関数の結果が値Cのとき元のイテラブルを値A, 値B, 値Cのグループに分けて新たなイテレータが生成されます。
groupby関数を用いたサンプル
以下のようなデータがあるとします。
rec=[
{"FirstName": "Suzuki" ,"LastName": "Taro" ,"City": "Tokyo"}
,{"FirstName": "Tanaka" ,"LastName": "Ichiro" ,"City": "Osaka"}
,{"FirstName": "Sato" ,"LastName": "Miki" ,"City": "Kanagawa"}
,{"FirstName": "Mori" ,"LastName": "Jiro" ,"City": "Osaka"}
,{"FirstName": "Tanaka" ,"LastName": "Megumi" ,"City": "Tokyo"}
]
これをCity毎のイテラブルに分割します。"Tokyo","Osaka","Kanagawa"の3つにわけます。groupby関数を使うにはグループ分けするキーで事前にソートされている必要があるためソートをかけます。
rec.sort(key=lambda x:x["City"])
print("ソート結果")
print(rec)
これで以下のようにソートがかかります(分かりやすいように改行しています)。
ソート結果 [ {'FirstName': 'Sato', 'LastName': 'Miki', 'City': 'Kanagawa'}, {'FirstName': 'Tanaka', 'LastName': 'Ichiro', 'City': 'Osaka'}, {'FirstName': 'Mori', 'LastName': 'Jiro', 'City': 'Osaka'}, {'FirstName': 'Suzuki', 'LastName': 'Taro', 'City': 'Tokyo'}, {'FirstName': 'Tanaka', 'LastName': 'Megumi', 'City': 'Tokyo'}]
これをgroupbyでCityごとのイテレータに分割してループを回してみます。
for key,value in groupby(rec,key=lambda x:x["City"]):
print("==============")
print(key)
for r in value:
print(r)
上記の一番外のループでは1回回す毎にCity毎のイテラブルを取得できます。さらに内側で行ごとのディクショナリを取得しています。
実行結果
============== Kanagawa {'FirstName': 'Sato', 'LastName': 'Miki', 'City': 'Kanagawa'} ============== Osaka {'FirstName': 'Tanaka', 'LastName': 'Ichiro', 'City': 'Osaka'} {'FirstName': 'Mori', 'LastName': 'Jiro', 'City': 'Osaka'} ============== Tokyo {'FirstName': 'Suzuki', 'LastName': 'Taro', 'City': 'Tokyo'} {'FirstName': 'Tanaka', 'LastName': 'Megumi', 'City': 'Tokyo'}
このようにgroupbyを用いることでグループ分けしたイテラブルを簡単に生成することができます。
まとめ
今回はgroupby関数についてのべました。group byをデータベース側おこなうとどうしても処理が重くなる場合があります。かといってプログラム側で処理をおこなおうとするとキーが切り替わった時の処理の記述が複雑になる場合があります。
そのような場合でも、今回述べたgroupby関数を用いると項目の値ごとにイテラブルを分割し簡潔に処理を記述することができます。積極的に活用してみてください。
Comment on this article
コメントはまだありません。
Send comments