使用 Python 对相似索引元素上的记录进行分组
在 Python 中,可以使用 pandas 和 numpy 等库对相似索引元素上的记录进行分组,这些库提供了几个执行分组的函数。基于相似索引元素的记录分组用于数据分析和操作。在本文中,我们将了解和实现各种按相似索引元素对记录进行分组的方法。
方法 1:使用 pandas groupby()
Pandas 是一个功能强大的数据操作和分析库。groupby() 函数允许我们根据一个或多个索引元素对记录进行分组。让我们考虑一个数据集,其中我们有一个学生分数的数据集,如下面的示例所示。
语法
grouped = df.groupby(key)
在这里,Pandas GroupBy 方法用于根据一个或多个键对 DataFrame 中的数据进行分组。"key"参数表示应按其对数据进行分组的列。生成的"grouped"对象可用于分别对每个组执行操作和计算。
示例
在下面的示例中,我们使用 groupby() 函数按"Name"列对记录进行分组。然后,我们使用 mean() 函数计算每个学生的平均分数。生成的 DataFrame 显示每个学生的平均分数。
import pandas as pd # 创建示例 DataFrame data = { 'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'], 'Subject': ['Math', 'English', 'Math', 'English', 'Math'], 'Score': [85, 90, 75, 92, 80] } df = pd.DataFrame(data) # 按名称分组 grouped = df.groupby('Name') # 计算分组数据的平均值 mean_scores = grouped.mean() print(mean_scores)
输出
Name Score Alice 88.5 Bob 85.0 Charlie 75.0
方法 2:使用 collections 模块中的 defaultdict
Python 中的 collections 模块提供了一个 defaultdict 类,它是内置 dict 类的子类。如果键不存在,它会通过自动创建新的键值对来简化分组过程。
语法
groups = defaultdict(list) groups[item].append(item)
此处,语法使用 collections 模块中的 defaultdict() 函数初始化一个名为 groups 的 defaultdict 对象,默认值为空列表。第二行代码使用键 (item) 访问 groups 字典中与该键关联的列表,并将该项目附加到列表中。
示例
在下面的示例中,我们使用了 defaultdict,并以列表作为默认值。我们遍历分数列表,并将科目-分数对附加到 defaultdict 中相应学生的键。生成的字典显示了分组记录,其中每个学生都有一个科目-分数对列表。
from collections import defaultdict # 创建分数示例列表 scores = [ ('Alice', 'Math', 85), ('Bob', 'English', 90), ('Charlie', 'Math', 75), ('Alice', 'English', 92), ('Bob', 'Math', 80) ] grouped_scores = defaultdict(list) for name, subject, score in scores: grouped_scores[name].append((subject, score)) print(dict(grouped_scores))
输出
{'Alice': [('Math', 85), ('English', 92)], 'Bob': [('English', 90), ('Math', 80)], 'Charlie': [('Math', 75)]}
方法 3:使用 itertools.groupby()
Python 中的 itertools 模块提供了一个 groupby() 函数,该函数根据关键函数对可迭代对象中的元素进行分组。
语法
list_name.append(element)
此处,append() 函数是一种列表方法,用于将元素添加到 list_name 的末尾。它通过将指定元素添加为新项目来修改原始列表。
示例
在下面的示例中,我们使用了 itertools 模块中的 groupby() 函数。在应用 groupby() 函数之前,我们使用 lambda 函数根据日期对事件列表进行排序。 groupby() 函数根据日期对事件进行分组,我们迭代这些组以提取事件名称并将其附加到 defaultdict 中相应日期的键。生成的字典显示分组的记录,其中每个日期都有一个事件列表。
from itertools import groupby # 创建日期和事件的示例列表 events = [ ('2023-06-18', 'Meeting'), ('2023-06-18', 'Lunch'), ('2023-06-19', 'Conference'), ('2023-06-19', 'Dinner'), ('2023-06-20', 'Presentation') ] events.sort(key=lambda x: x[0]) # 根据日期对事件进行排序 grouped_events = defaultdict(list) for date, group in groupby(events, key=lambda x: x[0]): for _, event in group: grouped_events[date].append(event) print(dict(grouped_events))
输出
{ '2023-06-18': ['Meeting', 'Lunch'], '2023-06-19': ['Conference', 'Dinner'], '2023-06-20': ['Presentation'] }
结论
在本文中,我们讨论了如何使用不同的 Python 方法和库根据相似的索引元素对记录进行分组。Python 提供了几种方法来实现这一点,包括 pandas groupby() 函数、collections 模块中的 defaultdict 和 itertools 模块中的 groupby() 函数。每种方法都有其优点,可以根据手头任务的具体要求进行选择。