
本文介绍如何使用 pandas 的 groupby().transform() 高效地为分组数据中每组的最大值所在行添加布尔标识列,避免显式循环,提升代码可读性与执行效率。
本文介绍如何使用 pandas 的 `groupby().transform()` 高效地为分组数据中每组的最大值所在行添加布尔标识列,避免显式循环,提升代码可读性与执行效率。
在数据分析中,常需识别每个分组内某列(如销售额)达到极值的记录。例如,给定按 product_id 分组的周度销售数据,目标是新增一列 product_max,标记每款产品销售额最高的那一周(若有并列,则全部标记为 True)。
核心思路是:不聚合、不丢失行索引——借助 transform('max') 对每组计算 sales 的最大值,并广播回原 DataFrame 的对应行,再与原始 sales 列逐元素比较,生成布尔结果。
以下是完整实现:
import pandas as pd
# 构造示例数据
data = {
'product_id': ['A1', 'A1', 'A1', 'A2', 'A2', 'A2'],
'week_number': [1, 2, 3, 1, 2, 3],
'sales': [1000, 2000, 3000, 8000, 4000, 2000]
}
df = pd.DataFrame(data)
# 添加标识列:每 product_id 组内 sales 最大值所在行为 True
df['product_max'] = df.groupby('product_id')['sales'].transform('max') == df['sales']
print(df)输出结果:
product_id week_number sales product_max 0 A1 1 1000 False 1 A1 2 2000 False 2 A1 3 3000 True 3 A2 1 8000 True 4 A2 2 4000 False 5 A2 3 2000 False
✅ 关键优势:
-
transform保持原始 DataFrame 行数与索引对齐,天然适配列级赋值; - 比
apply(lambda x: x == x.max())更简洁高效; - 支持并列最大值自动全选(如某产品两周销量同为最高,两行均标
True)。
⚠️ 注意事项:
- 若需仅保留首条最大值行(忽略并列),应改用
idxmax()+isin()组合; -
transform('max')对含缺失值(NaN)的组默认跳过,若需特殊处理(如视NaN为最小值),需先填充或指定skipna=False(注意:transform不支持skipna=False,此时建议改用apply); - 列名需确保无歧义(如避免与内置方法名冲突)。
该方法是 pandas 分组标记任务的标准范式,兼顾性能、可读性与健壮性,推荐作为此类需求的首选方案。

















