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

pandas groupby计算均值仅返回部分列 如何保留所有列

问题原因

pandas中groupby().mean()逻辑默认仅对**数值类型列(int、float、bool等数值格式)**计算均值,非数值类型列(object字符串、category分类、datetime时间等类型)会被自动排除,不会出现在计算结果中。
你当前170列的数据集分组后仅返回8列,本质是除分组键fsa和最终返回的7个结果列外,剩余162列均为非数值类型,被均值计算逻辑自动过滤。你代码中[list(df.columns)]的写法本身没有问题,列缺失和列类型直接相关。
额外说明:结果中出现的index列,一般是原始DataFrame携带了未重置的行索引被转成了普通列,不需要的话可以提前执行df = df.reset_index(drop=True)清理。

排查方法

先执行以下代码确认各列数据类型,验证非数值列范围:

# 统计各数据类型的列数量
print(df.dtypes.value_counts())
# 输出所有会被mean()默认过滤的非数值列名
print("被默认排除的非数值列:", df.select_dtypes(exclude='number').columns.tolist())
解决方案

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

  • 方案1:你需要对所有可计算均值的列求均值,部分数值列被误存为字符串类型
    先批量转换可转数值的列,再执行分组计算即可:
    # 批量将可转换的列转为数值类型,无法转换的非数值列保持原有类型
    df = df.apply(pd.to_numeric, errors='ignore')
    # 分组计算均值,as_index=False等效于reset_index()
    base = df.groupby('fsa', as_index=False).mean()
    
  • 方案2:你需要在保留数值列均值的同时,同步保留同分组下的非数值列
    非数值列本身无法计算均值,需要先明确非数值列的聚合规则(比如取分组下第一个值、去重后拼接等),用agg自定义聚合逻辑:
    agg_config = {}
    for col in df.columns:
        if col == 'fsa':
            continue
        # 数值列统一计算均值
        if pd.api.types.is_numeric_dtype(df[col]):
            agg_config[col] = 'mean'
        # 非数值列自定义规则,这里示例取分组下第一个值,可按需替换
        # 比如换成lambda x: ','.join(x.unique()) 可以把同组非数值去重后用逗号拼接
        else:
            agg_config[col] = 'first'
    
    base = df.groupby('fsa', as_index=False).agg(agg_config)
    

注意:非数值列的聚合规则一定要匹配业务逻辑,比如nameid这类唯一标识列,如果同fsa分组下有多个取值,取第一个值或者拼接都要符合你后续的使用需求,不要盲目套用规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:15:47