使用 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

# Creating a sample DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
    'Subject': ['Math', 'English', 'Math', 'English', 'Math'],
    'Score': [85, 90, 75, 92, 80]
}

df = pd.DataFrame(data)

# group by name
grouped = df.groupby('Name')

# calculate mean value of grouped data
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,其默认值为列表。我们遍历 scores 列表并将科目分数对附加到 defaultdict 中相应学生的键。生成的字典显示分组后的记录,其中每个学生都有一个科目分数对的列表。

from collections import defaultdict

# Creating a sample list of scores
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() 函数是列表方法,用于将元素添加到列表名称的末尾。它通过将指定元素作为新项添加到列表中来修改原始列表。

示例

在下面的示例中,我们使用了 itertools 模块中的 groupby() 函数。在应用 groupby() 函数之前,我们使用 lambda 函数根据日期对 events 列表进行了排序。groupby() 函数根据日期对事件进行分组,我们遍历这些组以提取事件名称并将其附加到 defaultdict 中相应日期的键。生成的字典显示分组后的记录,其中每个日期都有一个事件列表。

from itertools import groupby

# Creating a sample list of dates and events
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])  # Sort the events based on dates

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() 函数。每种方法都有其优点,可以根据手头任务的具体要求进行选择。

更新于: 2023年7月17日

75 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告