Pandas:复杂聚合的高级 GroupBy 技术

本文将指导您使用 Pandas 库了解高级分组技术,以有效地处理这些复杂的场景。

来源:KDnuggets
作者图片

# 简介

#

虽然 groupby().sum() 和 groupby().mean() 适合快速检查,但生产级指标需要更强大的解决方案。现实世界的表通常涉及多个键、时间序列数据、权重以及促销、退货或异常值等各种条件。

groupby().sum() groupby().mean()

这意味着您经常需要计算总计和比率、对每个分段中的项目进行排名、按日历存储桶汇总数据,然后将组统计数据合并回原始行以进行建模。本文将指导您使用 Pandas 库了解高级分组技术,以有效地处理这些复杂的场景。

熊猫

# 选择正确的模式

// 使用 agg 将组缩减为一行

//

当您希望每组一条记录(例如总计、平均值、中位数、最小/最大值和自定义矢量化缩减)时,请使用 agg。

聚合
输出 = (
    df.groupby(['store', 'cat'], as_index=False, sort=False)
      .agg(销售额=('rev', '总和'),
           订单=('order_id', 'nunique'),
           avg_price=('价格', '平均值'))
)

这对于关键绩效指标 (KPI) 表、每周汇总和多指标摘要很有用。

// 使用转换将统计数据广播回行

变换方法返回与输入形状相同的结果。它非常适合在每行上创建所需的功能,例如 z 分数、组内共享或按组填充。

变换
g = df.groupby('store')['rev']
df['rev_z'] = (df['rev'] - g.transform('mean')) / g.transform('std')
df['rev_share'] = df['rev'] / g.transform('sum')

这对于特征建模、质量保证比和插补很有用。

// 使用 apply 自定义每组逻辑

仅当所需逻辑无法用内置函数表达时才使用 apply。它速度较慢且难以优化,因此您应该首先尝试 agg 或 transform。

应用
def capped_mean(s):
    q1, q3 = s.quantile([.25, .75])
    返回 s.clip(q1, q3).mean()

df.groupby('store')['rev'].apply(capped_mean)
过滤器

// 按多个键分组