Python itertools groupby
最后修改于 2025 年 2 月 25 日
Python itertools 模块中的 groupby 函数用于根据键函数对数据进行分组。它尤其适用于将排序后的数据分组到有意义的类别中。本教程将通过实际示例介绍如何使用 groupby。
groupby 函数要求数据必须按照用于分组的相同键进行排序。它返回一个迭代器,该迭代器会生成可迭代对象中的连续键和组。
基本分组
此示例演示如何按单个键对数据进行分组。
basic_groupby.py
from itertools import groupby
# Dataset
data = [
{'Adventurer': 'Lara', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 5, 'Danger_Level': 'Medium'},
{'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 10, 'Danger_Level': 'High'},
{'Adventurer': 'Nathan', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 3, 'Danger_Level': 'Low'},
{'Adventurer': 'Lara', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 8, 'Danger_Level': 'High'},
{'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 15, 'Danger_Level': 'High'},
{'Adventurer': 'Nathan', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 4, 'Danger_Level': 'Medium'},
{'Adventurer': 'Elena', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 6, 'Danger_Level': 'Low'},
{'Adventurer': 'Lara', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 12, 'Danger_Level': 'Medium'}
]
# Sort data by Adventurer
data.sort(key=lambda x: x["Adventurer"])
# Group by Adventurer
for key, group in groupby(data, key=lambda x: x["Adventurer"]):
print(f"Adventurer: {key}")
for item in group:
print(item)
print()
groupby 函数按 Adventurer 键对数据进行分组。数据首先按相同的键进行排序,以确保正确分组。
按多个键分组
此示例演示如何按多个键对数据进行分组。
groupby_multiple_keys.py
from itertools import groupby
from operator import itemgetter
# Dataset
data = [
{'Adventurer': 'Lara', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 5, 'Danger_Level': 'Medium'},
{'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 10, 'Danger_Level': 'High'},
{'Adventurer': 'Nathan', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 3, 'Danger_Level': 'Low'},
{'Adventurer': 'Lara', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 8, 'Danger_Level': 'High'},
{'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 15, 'Danger_Level': 'High'},
{'Adventurer': 'Nathan', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 4, 'Danger_Level': 'Medium'},
{'Adventurer': 'Elena', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 6, 'Danger_Level': 'Low'},
{'Adventurer': 'Lara', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 12, 'Danger_Level': 'Medium'}
]
# Sort data by Region and Danger_Level
data.sort(key=itemgetter("Region", "Danger_Level"))
# Group by Region and Danger_Level
for key, group in groupby(data, key=itemgetter("Region", "Danger_Level")):
print(f"Region: {key[0]}, Danger Level: {key[1]}")
for item in group:
print(item)
print()
groupby 函数根据指定的键对数据集中的项进行分组。for 循环遍历每个组,每个组由一个键和一个包含该组中项的迭代器组成。在循环内部,数据按 Adventurer 键进行分组。数据首先按相同的键进行排序,以确保正确分组。
聚合分组数据
此示例演示如何在每个组内聚合数据。
aggregate_groupby.py
from itertools import groupby
# Dataset
data = [
{'Adventurer': 'Lara', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 5, 'Danger_Level': 'Medium'},
{'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 10, 'Danger_Level': 'High'},
{'Adventurer': 'Nathan', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 3, 'Danger_Level': 'Low'},
{'Adventurer': 'Lara', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 8, 'Danger_Level': 'High'},
{'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 15, 'Danger_Level': 'High'},
{'Adventurer': 'Nathan', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 4, 'Danger_Level': 'Medium'},
{'Adventurer': 'Elena', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 6, 'Danger_Level': 'Low'},
{'Adventurer': 'Lara', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 12, 'Danger_Level': 'Medium'}
]
# Sort data by Treasure
data.sort(key=lambda x: x["Treasure"])
# Group by Treasure and calculate total Quantity
for key, group in groupby(data, key=lambda x: x["Treasure"]):
total_quantity = sum(item["Quantity"] for item in group)
print(f"Treasure: {key}, Total Quantity: {total_quantity}")
groupby 函数按 Treasure 对数据进行分组,并使用 sum 函数计算每种宝藏类型的总量。
使用 groupby 的最佳实践
- 先对数据排序:始终使用用于分组的相同键对数据进行排序。
- 对多个键使用 itemgetter:
itemgetter函数可简化按多个键进行排序和分组。 - 避免处理大型数据集:对于非常大的数据集,请考虑使用
pandas等库以获得更好的性能。 - 高效地聚合数据:使用
sum、max或min等内置函数来聚合分组数据。
来源
在本文中,我们探讨了如何使用 Python itertools 模块中的 groupby 函数对数据进行分组和聚合。
作者
列出所有 Python 教程。