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
相关产品推荐
相关产品推荐

