groupby().mean()用于按列分组后计算数值列算术平均值,默认忽略NaN、将分组键设为索引;支持指定列、控制缺失值处理、重置索引及结合agg实现混合聚合与自定义列名。

当您使用 pandas 对数据进行分组聚合时,groupby().mean() 是最常用的操作之一,用于按指定列分组后计算每组数值列的算术平均值。以下是该操作的具体实现方式与适用情形:
一、基础语法与默认行为
pandas 的 groupby 对象在调用 mean() 方法时,默认对所有可数值化的列执行均值计算,并自动忽略 NaN 值。该方法不改变原始 DataFrame 的索引结构,但会将分组键提升为结果的索引(或作为新列,取决于 as_index 参数设置)。
1、导入 pandas 并创建示例数据框:
import pandas as pd
df = pd.DataFrame({'category': ['A', 'A', 'B', 'B'], 'value1': [10, 20, 30, 40], 'value2': [1.5, 2.5, 3.5, 4.5]})
2、执行分组求平均:
result = df.groupby('category').mean()
3、查看结果:
print(result)
二、指定数值列进行分组均值计算
若数据框中包含非数值列(如字符串、时间戳等),直接调用 mean() 可能触发警告或跳过这些列。显式指定列名可确保仅对目标数值列计算均值,提高可控性与性能。
1、仅对 value1 列求均值:
df.groupby('category')['value1'].mean()
2、同时对多个指定列求均值:
df.groupby('category')[['value1', 'value2']].mean()
3、结果返回一个具有 MultiIndex 列结构的 DataFrame,列名为原字段名,行索引为 category 分组键。
三、处理缺失值的策略控制
mean() 默认启用 skipna=True,即自动排除 NaN 后计算均值。但在某些分析场景中,需识别全为缺失的组或强制保留 NaN,此时可通过参数干预行为。
1、显式声明跳过缺失值:
df.groupby('category').mean(skipna=True)
2、禁用缺失值跳过(使整组含任一 NaN 即返回 NaN):
df.groupby('category').mean(skipna=False)
3、验证某组是否全为 NaN:结合 count() 与 size() 判断 —— 若 count() 返回 0 而 size() > 0,则该组所有值均为 NaN。
四、重置索引并保留分组列为普通列
默认情况下,groupby 结果将分组键设为索引,不利于后续合并或导出。使用 reset_index() 可将其还原为常规列,增强下游操作兼容性。
1、执行分组均值并重置索引:
df.groupby('category').mean().reset_index()
2、指定新列名以避免歧义(尤其多级列时):
df.groupby('category').mean().reset_index(name='avg_value')
3、注意:name 参数仅对单列聚合有效;多列聚合需使用 rename 或列名映射方式重命名。
五、结合 agg 实现混合聚合与列别名
当需对不同列应用不同聚合函数,或为结果列指定语义化名称时,agg 方法比链式 mean() 更灵活。它支持字典映射和命名元组形式,可统一输出结构。
1、对 value1 求均值、value2 求最大值:
df.groupby('category').agg({'value1': 'mean', 'value2': 'max'})
2、为结果列赋予自定义名称:
df.groupby('category').agg(avg_v1=('value1', 'mean'), max_v2=('value2', 'max'))
3、该写法生成的列名为 avg_v1 和 max_v2,无需额外 rename,且保持单层列索引结构。










