Pythonで辞書の値を集計する方法(Counter / groupbyの活用)初心者向け完全ガイド
先生と生徒の会話形式で理解しよう
生徒
「Pythonで辞書の値を集計する方法ってありますか?例えば、同じ値が何回出てくるか数えたいです。」
先生
「はい、そんなときはcollections.Counterやitertools.groupbyを使うと便利ですよ。」
生徒
「その2つはどう違うんですか?」
先生
「Counterは出現回数を簡単に数えるときに、groupbyはデータをグループ分けして集計するときに使います。それぞれの使い方を見ていきましょう!」
-
1. collections.Counterで値の出現回数を集計する
collections.Counterは、リストや辞書の値が何回出てくるかを簡単に数えるクラスです。
from collections import Counter
data = {"A": "赤", "B": "青", "C": "赤", "D": "緑", "E": "青"}
counter = Counter(data.values())
print(counter)
Counter({'赤': 2, '青': 2, '緑': 1})
data.values()で辞書の値だけを取り出し、Counterに渡すと自動的に集計してくれます。
2. Counterの便利なメソッド
most_common()を使うと、出現回数の多い順に結果を取得できます。
print(counter.most_common())
print(counter.most_common(1))
[('赤', 2), ('青', 2), ('緑', 1)]
[('赤', 2)]
この方法なら、ランキング形式で集計結果を表示することも可能です。
3. itertools.groupbyでグループごとに集計する
groupbyは、指定したキーでデータをまとめる機能があります。使う前にデータをソートする必要があります。
from itertools import groupby
data_items = [
{"色": "赤", "数量": 5},
{"色": "青", "数量": 3},
{"色": "赤", "数量": 2},
{"色": "青", "数量": 4},
{"色": "緑", "数量": 1},
]
data_items.sort(key=lambda x: x["色"])
grouped = groupby(data_items, key=lambda x: x["色"])
for color, items in grouped:
total = sum(item["数量"] for item in items)
print(color, total)
赤 7
青 7
緑 1
このように、groupbyでは「色」ごとの数量合計を計算できます。
4. Counterとgroupbyの使い分け
- Counter:単純に値の出現回数を数えたいとき
- groupby:特定のキーでまとめて合計や平均などを出したいとき
例えば「どの色が何回出たか」ならCounter、「どの色の数量合計がいくつか」ならgroupbyが適しています。
-
5. 実用例:アンケート結果の集計
例えば、アンケートで好きな色を答えてもらい、その結果を集計する場合、Counterを使うと簡単です。
votes = ["赤", "青", "赤", "緑", "青", "青"]
result = Counter(votes)
print(result)
Counter({'青': 3, '赤': 2, '緑': 1})
この結果を棒グラフにして可視化すれば、データ分析にも応用できます。
6. 実用例:売上データのグループ集計
商品ごとの売上合計を出す場合はgroupbyが便利です。
sales = [
{"商品": "りんご", "売上": 100},
{"商品": "バナナ", "売上": 80},
{"商品": "りんご", "売上": 120},
{"商品": "バナナ", "売上": 90},
]
sales.sort(key=lambda x: x["商品"])
for product, items in groupby(sales, key=lambda x: x["商品"]):
total_sales = sum(item["売上"] for item in items)
print(product, total_sales)
りんご 220
バナナ 170
このように、groupbyを使うと複数の条件で柔軟に集計できます。