「Pythonでのデータ処理に役立つgroupby()関数の使い方」

python

概要

pythonの組み込み関数であるgroupby()は、リストやイテレータオブジェクトを指定のキーでグループ化することができる非常に便利な関数です。

同じグループに属する要素を一括して取り扱う場合に特に有用です。

詳細内容

groupby()関数は、ひとつのリストやイテレーターオブジェクトを指定のキーでグループ化する関数です。

指定されたキーが同じ要素が一括して扱われるので、同じグループに属する要素をまとめて扱うときに非常に便利です。

例えば、以下のようなリストがあるとします。


words = ['apple', 'ant', 'banana', 'bat', 'cat', 'can']

これをアルファベットの頭文字でグループ化する場合、以下のようにします。

python
from itertools import groupbywords = ['apple', 'ant', 'banana', 'bat', 'cat', 'can']
groups = groupby(words, key=lambda x: x[0])for key, group in groups:
    print(key, list(group))

実行すると、以下のように表示されます。


a ['apple', 'ant']
b ['banana', 'bat']
c ['cat', 'can']

ここで、groupby()関数に与えたkey引数のlambda関数は、各単語の最初の文字を取り出して返す関数です。

この関数で取得した最初の文字でグループ化され、同じ最初の文字を持つ単語がまとめられます。

groupby()関数が返す値は、キーとグループのイテレーターオブジェクトからなるタプルです。

上記の例では、キーが’a’, ‘b’, ‘c’の3つのグループが返され、各グループにはそのキーと対応する単語のリストが含まれます。

groupby()関数は、リストだけでなく、イテレーターオブジェクトに対しても使用できます。

そして、イテレーターオブジェクトに対して使用すると、より効率的にメモリを使用することができます。

ただし、イテレーターオブジェクトには順序があるため、グループ化する前に必ずソートしておく必要があります。

例えば、以下のような辞書オブジェクトがあるとします。

python
items = [{'name': 'apple', 'category': 'fruit', 'price': 100},
         {'name': 'banana', 'category': 'fruit', 'price': 150},
         {'name': 'carrot', 'category': 'vegetable', 'price': 80},
         {'name': 'donut', 'category': 'snack', 'price': 200},
         {'name': 'eggplant', 'category': 'vegetable', 'price': 120}]

この場合、’category’キーでグループ化したいときは、以下のようにします。

python
from operator import itemgetter
from itertools import groupbyitems = [{'name': 'apple', 'category': 'fruit', 'price': 100},
         {'name': 'banana', 'category': 'fruit', 'price': 150},
         {'name': 'carrot', 'category': 'vegetable', 'price': 80},
         {'name': 'donut', 'category': 'snack', 'price': 200},
         {'name': 'eggplant', 'category': 'vegetable', 'price': 120}]items_sorted = sorted(items, key=itemgetter('category'))
groups = groupby(items_sorted, key=itemgetter('category'))for key, group in groups:
    print(key, list(group))

実行すると、以下のように表示されます。


fruit [{'name': 'apple', 'category': 'fruit', 'price': 100}, {'name': 'banana', 'category': 'fruit', 'price': 150}]
vegetable [{'name': 'carrot', 'category': 'vegetable', 'price': 80}, {'name': 'eggplant', 'category': 'vegetable', 'price': 120}]
snack [{'name': 'donut', 'category': 'snack', 'price': 200}]

この場合、itemgetter()関数で’category’キーを指定してソートしています。

そして、グループ化するときにも同じキーを指定しています。

なお、groupby()関数は、単純に指定のキーでグループ化するだけであり、グループ内の要素の並び順は変更されません。

以前の例ではグループ化されたリストを表示しましたが、それらはグループ内の要素の並び順を反映していないため、違った並び順で表示される可能性があります。

以上のように、groupby()関数を利用することで、リストやイテレーターオブジェクトを指定のキーでグループ化することができ、同じグループに属する要素をまとめて扱うことができます。

コメント

タイトルとURLをコピーしました