使用 Python 按列表中的第 K 列对记录进行分组

pythonserver side programmingprogramming更新于 2024/1/21 21:18:00

在 Python 中,可以使用 Python 方法按列表中的第 k 列对记录进行分组,例如使用 itertools.groupby 函数、使用字典和使用 pandas 库。通过按第 k 列对记录进行分组,我们可以更有效地分析和处理数据。在本文中,我们将探索所有这些方法,并实现这些方法以按列表中的第 k 列对记录进行分组。

方法 1:使用 itertools.groupby 函数

itertools.groupby 函数是一种基于关键函数对元素进行分组的有用工具。此方法利用 itertools.groupby 函数根据第 K 列对记录进行排序并将它们分组在一起。它为列表中的记录分组提供了一种简洁有效的解决方案。

语法

list_name.append(element)

此处,append() 函数是一种列表方法,用于将元素添加到 list_name 的末尾。它通过将指定元素添加为新项目来修改原始列表。

itertools.groupby(iterable, key=None)

此处,groupby() 方法使用可迭代对象和键作为参数。

  • Iterable:这是输入可迭代对象,可以是任何要分组的元素序列或集合。

  • Key=None:这是一个可选参数,指定用作分组键的函数。如果没有提供键函数(即传递了 None),则元素本身将用作分组的键。

示例

在下面的示例中,我们首先使用 sorted 函数和 lambda 函数作为键,根据第 K 列对记录列表进行排序。然后,我们使用 itertools.groupby 根据相同的键对排序后的记录进行分组。最后,我们将每个组附加到列表中并返回它。

import itertools

def group_by_kth_column(records, k):
    sorted_records = sorted(records, key=lambda x: x[k-1])
    groups = []
    for key, group in itertools.groupby(sorted_records, key=lambda x: x[k-1]):
        groups.append(list(group))
    return groups

# 示例用法
records = [
    ['Alice', 25, 'Engineer'],
    ['Bob', 30, 'Manager'],
    ['Charlie', 25, 'Designer'],
    ['David', 30, 'Engineer'],
    ['Eve', 25, 'Manager'],
    ['Frank', 30, 'Designer']
]

grouped_records = group_by_kth_column(records, 2)

# Output
for group in grouped_records:
    print(group)

输出

[['Alice', 25, 'Engineer'], ['Charlie', 25, 'Designer'], ['Eve', 25, 'Manager']]
[['Bob', 30, 'Manager'], ['David', 30, 'Engineer'], ['Frank', 30, 'Designer']]

方法 2:使用字典

此方法使用字典根据第 K 列对记录进行分组。它提供了一种简单有效的方法来收集具有相同键值的记录。

语法

list_name.append(element)

此处,append() 函数是一种列表方法,用于将元素添加到 list_name 的末尾。它通过将指定元素添加为新项目来修改原始列表。

list(iterable)

此处,可以使用可选的 iterable 参数调用 list() 构造函数。如果提供,则 iterable 的元素将转换为新列表。如果没有给出参数,则创建一个空列表。

示例

在下面的示例中,我们遍历记录列表并使用第 K 列值作为访问字典的键。如果键存在,我们将记录附加到相应的列表中。否则,我们创建一个新的键值对,其中键是第 K 列值,值是包含当前记录的列表。最后,我们将字典值转换为列表并返回它。

def group_by_kth_column(records, k):
    groups = {}
    for record in records:
        key = record[k-1]
        if key in groups:
            groups[key].append(record)
        else:
            groups[key] = [record]
    return list(groups.values())

# 示例用法(与之前相同)
grouped_records = group_by_kth_column(records, 2)

# 输出(与之前相同)
for group in grouped_records:
    print(group)

输出

[['Alice', 25, 'Engineer'], ['Charlie', 25, 'Designer'], ['Eve', 25, 'Manager']]
[['Bob', 30, 'Manager'], ['David', 30, 'Engineer'], ['Frank', 30, 'Designer']]

方法 3:使用 pandas 库

此方法利用强大的 pandas 库来处理更广泛的数据集并执行高级数据操作。它将记录转换为 DataFrame,并利用 groupby 按第 K 列对数据进行分组。

语法

grouped = df.groupby(key)

此处,Pandas GroupBy 方法用于根据一个或多个键对 DataFrame 中的数据进行分组。"key"参数表示应按其对数据进行分组的列。生成的"grouped"对象可用于分别对每个组执行操作和计算。

示例

在下面的示例中,我们将记录列表转换为 pandas DataFrame。然后,我们使用 groupby 函数按第 K 列对 DataFrame 进行分组,并应用 lambda 函数将每个组转换为记录列表。最后,我们使用 tolist() 将分组的 DataFrame 转换为列表。

import pandas as pd

def group_by_kth_column(records, k):
    df = pd.DataFrame(records)
    grouped_df = df.groupby(k-1).apply(lambda x: x.values.tolist())
    return grouped_df.tolist()

# 示例用法(与之前相同)
grouped_records = group_by_kth_column(records, 2)

# 输出(与之前相同)
for group in grouped_records:
    print(group)

输出

[['Alice', 25, 'Engineer'], ['Charlie', 25, 'Designer'], ['Eve', 25, 'Manager']]
[['Bob', 30, 'Manager'], ['David', 30, 'Engineer'], ['Frank', 30, 'Designer']]

方法 3 - 使用 itertools.groupby()

Python 中的 itertools 模块提供了一个 groupby() 函数,该函数将来自基于 key 函数的可迭代对象。

语法

list_name.append(element)

此处,append() 函数是一种列表方法,用于将元素添加到 list_name 的末尾。它通过将指定元素添加为新项目来修改原始列表。

itertools.groupby(iterable, key=None)

此处,groupby() 方法将可迭代对象作为输入,并采用可选的 key 函数。它返回一个迭代器,该迭代器从可迭代对象生成包含连续键和组的元组。 key 函数用于确定分组标准。

示例

在下面的示例中,我们使用了 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])  # 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 中的不同方法按列表中的第 k 列对记录进行分组。我们实现了 itertools.groupby 函数、基于字典的分组以及使用 pandas 库。通过每种方法,我们都可以执行所需的分组,选择取决于数据集的大小和所需的功能等因素。


相关文章