PythonのCounterはリストや文字列の要素の出現回数を求めることができる機能を持ちます。今回はCounterの使い方や利用シーン、便利な関数をまとめてご紹介します。
Counter
Counterはcollectionsモジュールに含まれる主なデータ構造の一つです。
リストや文字列などの各要素の頻度を数えるのに便利です。結果は辞書形式で管理します。
例えば「リストに含まれる各要素の出現数」や「文字列に含まれる各文字の出現数」は以下のように求めることができます。
from collections import Counter
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)
print(counter) # Output: Counter({'apple': 3, 'banana': 2, 'orange': 1})
sentence = "hello world!"
counter = Counter(sentence)
print(counter) # Output: Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1})
他にも以下のようにCounterオブジェクトを作る方法はあります。これは手動で要素と件数を指定する方法です。
from collections import Counter
counter = Counter(a=3, b=1, c=2)
print(counter) # Counter({'a': 3, 'c': 2, 'b': 1})
なお、この方法では出現回数に0や不の値も設定できます。
Counterオブジェクトにはいくつか便利なメソッドがあります。
いくつかご紹介します!
elements()
Counterオブジェクトに含まれる要素を、出現回数に応じてイテレーターで返します。
出現回数が0以下の要素は無視されます。
from collections import Counter
counter = Counter(a=3, b=1, c=2)
elements = list(counter.elements())
print(elements) # ['a', 'a', 'a', 'b', 'c', 'c']
most_common(n)
出現回数が多い順にn個の要素を返す関数です。nを指定しなければ全ての要素が出現回数の多い順に並びます。
counter = Counter('aabbccdde')
common_elements = counter.most_common(2)
print(common_elements) # [('a', 2), ('b', 2)]
なお、nが0や不の値の場合、空のリストが返されます。
subtract(iterable_or_mapping)
指定した要素や辞書を使って出現回数を引き算できます。負の値も保持します。
counter = Counter(a=4, b=2, c=0, d=-2)
counter.subtract({'a': 1, 'b': 2, 'c': 3})
# counter.subtract(['a','b','b','c','c','c']) 同様の結果
print(counter) # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -2})
subtractにはCounterオブジェクトを渡すことも可能です。
counter1 = Counter(a=4, b=2, c=0, d=-2)
counter2 = Counter(a=6, b=1, c=-10, d=24)
counter1.subtract(counter2)
print(counter1) # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -2})
update(iterable_or_mapping)
subtractの逆で、出現回数を加算する関数です。
counter = Counter(a=4, b=2, c=0, d=-2)
# counter.subtract({'a': 1, 'b': 2, 'c': 3})
counter.update(['a','b','b','c','c','c'])
print(counter) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': -2})
subtractと同様、引数は辞書とリスト以外にもCounterオブジェクトを指定できます。
counter1 = Counter(a=4, b=2, c=0, d=-2)
counter2 = Counter(a=6, b=1, c=-10, d=24)
counter1.update(counter2)
print(counter1) # Counter({'d': 22, 'a': 10, 'b': 3, 'c': -10})
total()
Counterに含まれる全要素の出現回数を返します。
list1 = ['a','b','b','c','c','c']
counter = Counter(list1)
total_count = counter.total()
print(total_count) # 6
結果としてはlen(list1)
と同じ結果を返すことになります。
clear()
Counterの中身をリセットしすることができる関数です。
counter = Counter(a=3, b=2)
counter.clear()
print(counter) # Counter()
演算
Counter同士で要素ごとの値の和、差を算出できます。
またCounterの積集合、和集合を求めることもできます。
積集合は共通する要素の最小カウント、和集合は最大カウントを取ります。
counter1 = Counter(a=3, b=1)
counter2 = Counter(a=1, b=2, c=3)
# 和
print(counter1 + counter2) # Counter({'a': 4, 'b': 3, 'c': 3})
# 差
print(counter1 - counter2) # Counter({'a': 2})
# 積集合
print(counter1 & counter2) # Counter({'a': 1, 'b': 1})
# 和集合
print(counter1 | counter2) # Counter({'a': 3, 'b': 2, 'c': 3})
まとめ
collections.Counter
は、Pythonで要素の出現回数を簡単に数えるための強力なツールです。基本的な出現回数のカウントだけでなく、集計結果を元にした様々な操作が簡単に行えるため、データ解析や頻度分析の場面で役立ちます。
今回紹介したように、Counterには次のような便利な機能があります:
- most_common():最頻出の要素を簡単に抽出
- elements():出現回数に応じた要素の列挙
- subtract()・update():他の要素を使った出現回数の加減
- 和・差・積集合・和集合演算:複数のCounterオブジェクトを組み合わせたデータ処
これらのメソッドを活用することで、Counterを単なるカウントの枠を超えた多用途なツールとして使いこなすことができます。
Pythonで頻度分析をする際には、ぜひCounterを試してみてください!