Python でデータを扱うとき、ある Key で GroupBy(グループ化)するのはよくある作業です。たとえば Email Log を分析するときに、件名ごとの送信件数を知りたい場合や、件名ごとの Email Provider の上位5件を一覧にしたい場合などです。データベースがあれば、これは非常に簡単な作業です。しかし、データをデータベースに入れたくない場合はどうすればよいでしょうか。
そうした場合、非常に強力なデータ処理ライブラリである Pandas がおすすめですが、実は Python 本体にも GroupBy が用意されています!
itertools モジュールには groupby というメソッドがあります。コレクションを渡し、Key を指定すると、同じ Key のデータを1つのリストのようなもの(ただし実際にはリストではありません)にまとめてくれます。その後は、数を数えるか(同じ件名のメールの送信件数)、同じ Key のデータをそれぞれ一覧にする(件名ごとの Email Provider トップ5)ことができます。
ただし、GroupBy の前に、グループ化したい Key でデータを並べ替えておく必要があります。詳しい方法は以下のコードを参照してください(Python 3)。ここでは lambda を使って、Key にしたいフィールドを取得しています。
from itertools import groupby dicts = [ {'name': 'A', 'age': 16}, {'name': 'B', 'age': 18}, {'name': 'C', 'age': 17}, {'name': 'D', 'age': 16}, {'name': 'E', 'age': 17} ] dicts.sort(key=lambda d : d['age']) # Group By Age Field for key, groups in groupby(dicts, lambda d : d['age']): # print(list(groups)) # print(len(list(groups))) print(key) for item in groups: print(item) print('-----')