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

