Python 通用的group-by归约

  • Post category:Python

下面是关于Python通用的group-by归约使用方法的完整攻略。

1. group-by归约简介

group-by是一种常见的数据操作方式,它可以将数据按照某些指定的条件进行分组,然后对分组后的数据进行归约操作,比如求平均值、求和等。

Python中提供了基于标准库的group-by方法,可以很方便地实现数据的分组和归约操作,通常使用方法如下:

from itertools import groupby

# 定义分组函数
def grouper(item):
    # 根据某些条件返回用于分组的键
    return item['key']

# 定义数据
data = [
    {'key': 'A', 'value': 1},
    {'key': 'A', 'value': 2},
    {'key': 'B', 'value': 3},
    {'key': 'B', 'value': 4},
    {'key': 'C', 'value': 5},
]

# 排序数据
data.sort(key=grouper)

# 对数据进行分组并归约
for key, group in groupby(data, key=grouper):
    print(key, list(group))

上述代码中,我们通过定义一个分组函数grouper(),然后将函数作为groupby()方法的key参数传入,进行数据的分组和归约操作。其中,grouper()函数根据字典数据中的key项作为分组的键。最终输出结果为:

A [{'key': 'A', 'value': 1}, {'key': 'A', 'value': 2}]
B [{'key': 'B', 'value': 3}, {'key': 'B', 'value': 4}]
C [{'key': 'C', 'value': 5}]

2. 示例1:分组求和

下面通过一个实际的问题来演示如何使用group-by进行数据处理。

假设有一批订单数据,格式如下:

data = [
    {'date': '2021-01-01', 'category': 'A', 'amount': 10},
    {'date': '2021-01-01', 'category': 'B', 'amount': 20},
    {'date': '2021-01-02', 'category': 'A', 'amount': 30},
    {'date': '2021-01-02', 'category': 'B', 'amount': 40},
    {'date': '2021-01-03', 'category': 'A', 'amount': 50},
    {'date': '2021-01-03', 'category': 'B', 'amount': 60},
]

现在我们需要对订单数据进行分组求和,以日期为分组键,计算每个日期下各个商品分类的销售总额。

代码如下:

from itertools import groupby

# 定义分组函数
def grouper(item):
    # 根据日期分组
    return item['date']

# 定义数据
data = [
    {'date': '2021-01-01', 'category': 'A', 'amount': 10},
    {'date': '2021-01-01', 'category': 'B', 'amount': 20},
    {'date': '2021-01-02', 'category': 'A', 'amount': 30},
    {'date': '2021-01-02', 'category': 'B', 'amount': 40},
    {'date': '2021-01-03', 'category': 'A', 'amount': 50},
    {'date': '2021-01-03', 'category': 'B', 'amount': 60},
]

# 排序数据
data.sort(key=grouper)

# 分组求和
for key, group in groupby(data, key=grouper):
    total_amount = sum(item['amount'] for item in group)
    print(key, total_amount)

上述代码中,我们定义了一个分组函数grouper(),根据订单数据中的date项作为分组键。然后通过循环将分组后的数据计算销售总额,最终输出结果为:

2021-01-01 30
2021-01-02 70
2021-01-03 110

3. 示例2:分组求平均值

还可以通过group-by对数据进行分组求平均值,例如对一批学生成绩进行统计分析。

代码如下:

from itertools import groupby

# 定义分组函数
def grouper(item):
    # 根据科目分组
    return item['subject']

# 定义数据
scores = [
    {'subject': 'math', 'score': 90},
    {'subject': 'math', 'score': 80},
    {'subject': 'english', 'score': 85},
    {'subject': 'english', 'score': 75},
    {'subject': 'chinese', 'score': 70},
    {'subject': 'chinese', 'score': 60},
]

# 排序数据
scores.sort(key=grouper)

# 分组求平均值
for key, group in groupby(scores, key=grouper):
    avg_score = sum(item['score'] for item in group) / len(list(group))
    print(key, avg_score)

上述代码中,我们定义了一个分组函数grouper(),根据成绩数据中的subject项作为分组键。然后通过循环将分组后的数据计算平均分,最终输出结果为:

chinese 65.0
english 80.0
math 85.0

这样,通过group-by归约操作,可以方便地对数据进行分组和归约,实现更强大的数据分析能力。