groupby后mean()列减少因只计算数值列,非数值列被自动丢弃;count()统计非空值个数,size()统计总行数(含nan);as_index=false可保留分组列为普通列;多列分组须用列表或元组。

groupby 后直接调用 mean() 为什么结果列变少了?
因为 mean() 默认只对数值列生效,非数值列(比如字符串、时间戳、类别型)会被自动丢弃。这不是 bug,是 Pandas 的默认行为——它不试图对字符串求平均,干脆跳过。
- 如果想保留所有列并分别处理,得用
agg()显式指定每列的聚合方式,比如df.groupby('col').agg({'price': 'mean', 'name': 'first'}) - 如果误以为
groupby().mean()会保留原始列结构,容易漏掉关键分组标识列(比如col本身会变成索引,不显式重置就看不到) - 注意:
mean()对含NaN的列默认跳过缺失值;若想强制报错或保留NaN,需加skipna=False
count() 和 size() 看起来一样,到底该用哪个?
不一样。count() 统计每列**非空值个数**,而 size() 统计每组**总行数**(含 NaN)。
-
df.groupby('col').count()每列结果可能不同(取决于各列空值分布) -
df.groupby('col').size()返回一个Series,索引是分组键,值是每组总行数,更快更轻量 - 如果只是要“每组几条数据”,别用
count()套所有列,用size()更准也更省资源
分组后想保留原始索引,不丢数据怎么办?
默认 groupby 会把分组键设为新索引,原始索引被“压扁”进分组内部,查原始行号就断了。
- 加参数
as_index=False:比如df.groupby('col', as_index=False).mean(),结果里col是普通列,不是索引 - 如果已分组完,想恢复原始索引映射,别用
reset_index()盲目重置——它只还原层级索引,不恢复原始行号;真需要原始索引,得在分组前用df.reset_index(drop=False)把它先存成一列 - 注意:
as_index=False对size()无效,它永远返回Series;要用size().reset_index(name='count')
多列分组时,传元组还是列表?括号写错会怎样?
必须传列表或元组,但语法稍有不慎就会触发 KeyError 或奇怪的 TypeError。
- 正确写法:
df.groupby(['col_a', 'col_b'])或df.groupby(('col_a', 'col_b'))(注意外层是圆括号,不是单个字符串) - 常见错误:
df.groupby('col_a', 'col_b')—— 这会被解释成两个位置参数,Pandas 报TypeError: groupby() takes from 1 to 2 positional arguments - 另一个坑:
df.groupby(['col_a', 'col_b']).sum()中,若某列是object类型(如混合字符串/数字),sum()会尝试拼接字符串,不是报错而是静默出错,结果难以预料
df.dtypes 看一眼,比事后 debug 省半小时。










