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('-----')