一文详解Python如何优雅地对数据进行分组

  • Post category:Python

一文详解Python如何优雅地对数据进行分组

在数据分析、数据处理等场景下,对数据进行分组显得十分重要。Python 提供了多种方法对数据进行分组,其中包括:

  1. 使用 Pandas 库
  2. 使用 itertools 模块
  3. 使用自定义函数

在下面的内容中,我们将依次介绍这三种方法。

使用 Pandas 库

Pandas 库有丰富的分组功能,可以方便地对数据进行分组、聚合、过滤等操作。

1. 按列分组

我们可以使用 groupby() 方法按照某一列的值对数据进行分组。例如,我们有以下数据:

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank'],
    'age': [23, 24, 22, 22, 21, 25],
    'gender': ['F', 'M', 'M', 'M', 'F', 'M'],
    'score': [85, 93, 79, 81, 90, 87]
})

我们可以按照性别对数据进行分组:

grouped = df.groupby('gender')

这样我们就得到了一个按照性别分组后的对象,我们可以对它进行相关的操作,例如计算每个分组的平均分数:

grouped['score'].mean()

2. 按多列分组

当我们需要按照多列的值进行分组时,可以同时传入多个列名,例如:

grouped = df.groupby(['gender', 'age'])

这样我们就可以按照性别和年龄两个维度对数据进行分组。

3. 聚合操作

在分组后,我们常常需要进行聚合操作,例如计算分组后每个组的平均值、最大值、最小值等等。Pandas 提供了一些聚合函数,例如 mean()max()min() 等。

grouped['score'].mean()
grouped['score'].max()
grouped['score'].min()

4. 过滤操作

我们还可以使用 filter() 方法对分组后的数据进行筛选,例如筛选出平均分数大于等于 85 分的分组:

def filter_func(x):
    return x['score'].mean() >= 85

grouped.filter(filter_func)

使用 itertools 模块

Python 标准库中的 itertools 模块也提供了分组的函数。我们可以使用 groupby() 函数对一个可迭代对象进行分组。例如:

from itertools import groupby

data = [
    {'name': 'Alice', 'score': 85},
    {'name': 'Bob', 'score': 93},
    {'name': 'Charlie', 'score': 79},
    {'name': 'David', 'score': 81},
    {'name': 'Eva', 'score': 90},
    {'name': 'Frank', 'score': 87},
    {'name': 'Gary', 'score': 82},
    {'name': 'Helen', 'score': 79},
    {'name': 'Isaac', 'score': 85},
]

def key_func(row):
    if row['score'] >= 90:
        return 'A'
    elif row['score'] >= 80:
        return 'B'
    else:
        return 'C'

sorted_data = sorted(data, key=key_func)
for key, values in groupby(sorted_data, key=key_func):
    print(f'{key}: {list(values)}')

这样我们就可以按照分数的高低对数据进行分组。

自定义函数

除了使用 Pandas 和 itertools 提供的方法外,我们还可以根据需要自定义函数进行分组。

例如,我们有一个列表,需要对其中的偶数和奇数进行分组:

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def key_func(num):
    if num % 2 == 0:
        return 'even'
    else:
        return 'odd'

grouped_data = {}
for num in nums:
    key = key_func(num)
    if key in grouped_data:
        grouped_data[key].append(num)
    else:
        grouped_data[key] = [num]

print(grouped_data)

使用自定义函数进行分组时,需要注意函数的返回值类型必须是 hashable,即可哈希的,否则 Python 会抛出 TypeError 异常。

以上就是 Python 如何优雅地对数据进行分组的完整攻略。