使用 Python 對列表中按第 K 列對記錄進行分組


在 Python 中,可以使用 Python 方法(如使用 itertools.groupby 函式、使用字典和使用 pandas 庫)對列表中按第 k 列對記錄進行分組。透過按第 k 列對記錄進行分組,我們可以更有效地分析和操作資料。在本文中,我們將探討所有這些方法,並實現這些方法來對列表中按第 k 列對記錄進行分組。

方法 1:使用 itertools.groupby 函式

itertools.groupby 函式是基於鍵函式對元素進行分組的有用工具。此方法利用 itertools.groupby 函式根據第 K 列對記錄進行排序並將其分組。它為對列表中的記錄進行分組提供了一個簡潔高效的解決方案。

語法

list_name.append(element)

這裡,append() 函式是用於將元素新增到列表名稱末尾的列表方法。它透過將指定的元素作為新項新增到列表中來修改原始列表。

itertools.groupby(iterable, key=None)

這裡,groupby() 方法使用可迭代物件和鍵作為引數。

  • 可迭代物件:這是輸入可迭代物件,可以是您要分組的任何序列或元素集合。

  • Key=None:這是一個可選引數,用於指定用作分組鍵的函式。如果未提供鍵函式(即傳遞 None),則元素本身用作分組鍵。

示例

在下面的示例中,我們首先使用 sorted 函式和 lambda 函式作為鍵根據第 K 列對 records 列表進行排序。然後,我們使用 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

# Example usage
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(iterable)

這裡,list() 建構函式可以帶有一個可選的可迭代引數呼叫。如果提供,則可迭代物件的元素將轉換為新的列表。如果未給出任何引數,則會建立一個空列表。

示例

在下面的示例中,我們遍歷 records 列表,並使用第 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())

# Example usage (same as before)
grouped_records = group_by_kth_column(records, 2)

# Output (same as before)
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”物件可用於分別對每個組執行操作和計算。

示例

在下面的示例中,我們將 records 列表轉換為 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()

# Example usage (same as before)
grouped_records = group_by_kth_column(records, 2)

# Output (same as before)
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() 函式,該函式根據鍵函式對可迭代物件中的元素進行分組。

語法

list_name.append(element)

這裡,append() 函式是用於將元素新增到列表名稱末尾的列表方法。它透過將指定的元素作為新項新增到列表中來修改原始列表。

itertools.groupby(iterable, key=None)

這裡,groupby() 方法將可迭代物件作為輸入,並帶有一個可選的鍵函式。它返回一個迭代器,該迭代器生成包含可迭代物件中連續鍵和組的元組。鍵函式用於確定分組標準。

示例

在下面的示例中,我們使用了 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 中的不同方法對列表中按第 k 列對記錄進行分組。我們實現了 itertools.groupby 函式、基於字典的分組以及使用 pandas 庫。透過每種方法,我們可以執行所需的分組,選擇取決於資料集的大小和所需的功能等因素。

更新於:2023年7月18日

122 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.