广告

Python groupby 数据聚合详解:从基础用法到行业场景实战,提升数据分析效率

1 基础用法

groupby 的核心概念

在 Pandas 中,groupby 是对数据按照一个或多个键进行分组的操作,随后对每个组执行聚合计算。理解它的核心是把数据看作若干个子集,再对每个子集执行相同的计算,从而得到汇总结果。该过程的关键点在于分组键和聚合目标的明确。

基本思路:先用 键字段 将数据分成若干组,然后对每组应用 聚合/转换/自定义函数,最后返回一个新的 DataFrame 或 Series。注意,groupby 之前的排序不是必需的,但分组键会影响结果的索引结构,可读性与可追溯性也会随之提升。

一个简单示例

下面的示例演示如何基于列 A 对数据分组,并对 B 求和。结果是一个以 A 的唯一值为索引的汇总 DataFrame,直观明了,便于后续分析。

import pandas as pd

df = pd.DataFrame({
    'A': ['x', 'y', 'x', 'y', 'x'],
    'B': [1, 2, 3, 4, 5],
    'C': ['p', 'q', 'p', 'q', 'p']
})

result = df.groupby('A')['B'].sum().reset_index()
print(result)

在这个例子中,groupby 会把 A 的取值 'x' 和 'y' 作为分组键,然后对每组的 B 列执行 聚合函数 sum,最终输出一个包含分组键和聚合结果的新表,便于快速比较不同分组的表现。

2 常见聚合函数与操作

聚合函数的选型

常见的聚合函数包括 sum、mean、max、min、count 等,它们构成了 Python groupby 数据聚合 的基础工具箱,适用于不同数据类型与统计需求。

除了对单列聚合,还可以对多列同时聚合,组合聚合 可以以字典或列表形式传给 agg,实现多种统计指标,从而提升分析效率。

示例:多列聚合

下面展示如何对列 B、C 同时进行聚合,并给出列名重命名以便阅读,强调了 agg 的灵活性。

import pandas as pd

df = pd.DataFrame({
    'A': ['x', 'x', 'y', 'y', 'y'],
    'B': [1, 2, 3, 4, 5],
    'C': [10, 20, 30, 40, 50]
})

result = df.groupby('A').agg({'B': ['sum', 'mean'], 'C': 'max'})
print(result)

agg 支持多种聚合方式,输出的列层级可以通过 多级列索引 直观显示各聚合指标,提升结果的可读性。

3 进阶用法与性能优化

多级分组与多键分组

实际场景中往往需要按照 多列键 进行分组,例如按地区和产品类别分组,或者按日期和店铺分组。groupby(['地区','类别']) 会产生一个多级索引的结果,这种结构在后续透视和合并时非常有用。

在处理大规模数据时,合理的分组策略能显著降低计算成本,减少重复计算,提升分析效率,尤其是在分组后需要重复应用同一聚合函数的场景。

transform、apply 与 agg 的区别

三者都属于对分组后的数据进行计算的方式,但返回结果不同:transform 会返回与原 DataFrame 同形状的数据,适合特征工程与后续数据合并;apply 提供灵活性,适合自定义函数;agg 专注于聚合统计,便于快速得到多维度汇总。

示例:transform 与自定义函数

下面展示如何用 groupby 对分组后的一列进行标准化,通过 transform 将结果并入原表,便于后续建模。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['x', 'x', 'y', 'y', 'y'], 'B': [1, 2, 3, 4, 5]})

# 对 B 按 A 分组后做 Z-score 标准化
def zscore(x):
    return (x - x.mean()) / x.std(ddof=0)

df['B_z'] = df.groupby('A')['B'].transform(zscore)
print(df)

这段代码展示了如何在不改变分组结构的前提下,将统计特征回填到原表中,提升可用性与后续分析的灵活性。

4 行业场景实战

金融风控与客户画像

在金融数据分析中,groupby 常用于对交易记录按客户、时间窗等维度进行聚合,帮助建立客户画像和风控指标。常见操作包括计算每个客户的总交易额、平均交易额和波动性,进而发现异常群体。

示例场景:按客户和月分组,计算月度总额与均值,快速对比不同客户的活跃度差异,提升风控模型的特征覆盖率与稳定性。

电商销售与用户行为分析

电商平台通常需要按地区、品类、活动等维度聚合销售指标,以支持经营决策。groupby 能把原始交易记录转化为可对比的 KPI,帮助业务团队把握市场趋势。

import pandas as pd

df = pd.DataFrame({
    'region': ['北方', '北方', '南方', '南方', '北方'],
    'category': ['电子', '服装', '电子', '服装', '电子'],
    'sales': [120, 80, 200, 150, 100],
})

# 按 region 和 category 分组,计算总销售额和订单数(演示目的)
df['orders'] = [1, 2, 1, 2, 1]
result = df.groupby(['region', 'category']).agg({'sales': 'sum', 'orders': 'sum'})
print(result)

多维聚合 能帮助管理层快速看见不同区域与品类的销售贡献,提升决策效率与执行力。

日志分析与传感数据聚合

对于日志或传感数据,groupby 常用于按时间段和来源进行聚合,提取滑动统计和异常指标,支撑稳定性监控与容量规划。通过将分组后的统计结果汇总到时间维度,可以得到清晰的时间序列视图。

示例:按日期和来源分组,统计请求数和错误率,辅助稳定性监控与容量预测,帮助运维快速定位异常波动。

import pandas as pd

df = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=6, freq='D'),
    'source': ['A', 'A', 'B', 'B', 'A', 'B'],
    'reqs': [100, 120, 80, 90, 110, 95],
    'errs': [1, 0, 2, 1, 0, 1]
})

result = df.groupby(['date', 'source'])[['reqs','errs']].sum().reset_index()
print(result)

注意,在新的 Pandas 版本中,选择列时应使用列表形式,如 ['reqs','errs'],以避免切片警告并保持向后兼容,确保在实际工作流中的稳健性。

广告

后端开发标签