You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas执行df.groupby(level=0).mean()时列丢失问题排查

问题成因

df.groupby().mean() 聚合时列数减少是pandas的默认机制导致,和concat拼接过程无关:

  • pandas的均值聚合默认仅对数值类型列(dtype为int、float系列)生效,字符串、时间、混合object类型等非数值列会被自动排除,不会进入最终聚合结果。
  • 你可以执行print(df_concat.dtypes)核对所有列的数据类型,统计下来数值类型的列数必然为14,和分组后剩余的列数完全匹配。出现类型不匹配的常见原因是纵向拼接时,部分列混入了字符串、格式异常的空值,导致整列被识别为object类型,无法参与均值计算。
解决方法

根据你的实际需求选对应方案即可:

方案1:仅需数值列求均值,保留非数值列的分组对应信息

如果业务逻辑上非数值列本身就无法计算均值,只需要在分组后把非数值列的对应值(比如每组第一个值、去重拼接值)和数值列的均值结果合并即可,参考代码:

import pandas as pd

# 单独聚合数值列求均值
numeric_part = df_concat.groupby(level=0).mean(numeric_only=True)
# 非数值列取每组第一条记录的内容,可根据需求替换为last()、unique()等聚合规则
non_numeric_part = df_concat.select_dtypes(exclude='number').groupby(level=0).first()
# 横向拼接得到完整结果
df_grouped = pd.concat([numeric_part, non_numeric_part], axis=1)

方案2:修复异常列的数据类型后再聚合

如果部分本该存储数值的列因为脏数据被识别为非数值类型,先做类型转换再执行聚合即可,参考代码:

# 填入所有需要参与均值计算的列名
need_calc_cols = ["col1", "col2", "col3"]
# 批量转数值类型,无法转换的脏数据会被设为空值NaN
df_concat[need_calc_cols] = df_concat[need_calc_cols].apply(pd.to_numeric, errors="coerce")
# 再执行分组聚合,转换后的数值列会正常参与均值计算
df_grouped = df_concat.groupby(level=0).mean()

补充说明

不同pandas版本对聚合的默认处理有差异,显式指定numeric_only参数可以避免版本兼容问题:

  • 传入numeric_only=True:明确只对数值列计算均值,和你当前遇到的默认行为一致
  • 传入numeric_only=False:强制尝试对所有列计算均值,非数值列会直接抛出类型错误,适合用来排查哪些列类型不符合预期

内容的提问来源于stack exchange,提问作者Greg Gonastarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:24:30