groupby必须传列表,如df.groupby(['col1', 'col2']);传元组会因pandas将其视为单个键而报keyerror;列名须严格匹配,含特殊字符时只能用方括号索引。

groupby传入列表还是元组?多列分组的语法细节
直接传列表就行,df.groupby(['col1', 'col2']) 是标准写法;传元组(如 df.groupby(('col1', 'col2')))会报错:Pandas 把元组当单个键处理,触发 KeyError。别被某些旧文档误导——这不是等价写法。
常见错误现象:KeyError: ('col1', 'col2'),本质是把元组当成了列名字符串去查。
- 必须用列表,哪怕只有一列也建议统一写成
['col'],避免后续加列时漏改括号类型 - 列名必须真实存在于
df.columns中,大小写和空格都要严格匹配 - 如果列名含空格或特殊字符,不能用点号访问,只能走方括号索引,所以分组也必须用字符串列表
agg() 里怎么对不同列用不同聚合函数?
用字典传参最灵活:agg({'sales': 'sum', 'price': 'mean', 'qty': ['min', 'max']})。注意键是列名(字符串),值可以是字符串函数名、函数对象,或函数名列表。
容易踩的坑:
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
- 如果某列没在字典里出现,它会被自动丢弃——Pandas 不会默认保留所有列
-
agg('mean')这种单函数写法会作用于所有数值列,但一旦用了字典,就只处理字典里列出的列 - 函数名字符串(如
'first')比直接传lambda x: x.iloc[0]快得多,尤其大数据量时 - 若想对同一列应用多个函数,值要写成列表,如
'sales': ['sum', 'count'],结果列名会变成多级索引(('sales', 'sum'))
分组后想保留原始索引或添加分组标识列?
默认情况下,groupby 会把分组键设为新 DataFrame 的索引。如果后续还要用原索引做合并或定位,得主动控制:
- 加参数
as_index=False,例如df.groupby(['region', 'year'], as_index=False).agg({'sales': 'sum'}),这样分组列会变成普通列,不进索引 - 如果已经分组完了,想把索引变回列,用
reset_index();但要注意,如果原索引有重复值,reset_index()会生成新序号列,老索引被降为普通列 - 想在结果里显式标记每行属于哪个分组,可以用
transform或apply配合lambda,但更轻量的是先groupby(...).size().reset_index(name='count')
性能敏感时,groupby 后该用 agg 还是 apply?
优先用 agg。它底层调用的是高度优化的 Cython 路径,而 apply 默认按行/列迭代 Python 对象,慢一个数量级以上。
典型对比:
df.groupby('category').agg({'value': 'mean'}) # 快
df.groupby('category').apply(lambda g: g['value'].mean()) # 慢,且返回索引结构不同
-
apply真正适合的场景是:需要跨列计算(比如用 A 列和 B 列一起算一个指标)、或返回结构不规则的结果(如每组返回一个 DataFrame) - 如果只是单列聚合,哪怕逻辑稍复杂,也尽量拆成
agg支持的函数组合,或用transform+ 向量化运算 - 大数据量下,
agg的内存占用也明显低于apply,因为不构造中间 group 对象
分组键的类型和缺失值处理常被忽略:如果分组列里有 NaN,Pandas 默认会把它们单独归为一组(不是丢弃),且该组的键显示为 NaN —— 这在 join 或后续筛选时容易出错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










