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

如何在Pandas中使用groupby和mean()后保留分类变量?

在Pandas中GroupBy并求均值后保留分类变量的方法

当然有办法实现这个需求!想要在聚合操作后保留Metadata_A、Metadata_B、treatment这些分类变量,核心思路就是把这些分类列纳入分组键中,这样它们会自然出现在聚合结果里。下面给你几种实用的实现方式:

方法1:直接分组所有需要保留的列,指定聚合列求均值

这是最直接的方式,把所有要保留的分类列放进groupby()的参数列表,同时指定对ratio列求均值,再通过as_index=False让分组列以普通列的形式保留(而非索引):

import pandas as pd

# 假设你的DataFrame是df
agg_result = df.groupby(['treatment', 'Metadata_A', 'Metadata_B'], as_index=False)['ratio'].mean()

方法2:使用agg()自定义聚合(支持多列/多操作)

如果后续需要对不同列执行不同聚合操作,或者想给聚合后的列起更清晰的别名,可以用agg()方法:

agg_result = df.groupby(['treatment', 'Metadata_A', 'Metadata_B'], as_index=False).agg(
    average_ratio=('ratio', 'mean')  # 给均值列起别名average_ratio
)

方法3:保留分类列的Categorical类型(如果已设置)

如果你的分类列已经被设置为Pandas的Categorical类型(比如df['treatment'] = pd.Categorical(df['treatment'])),那么聚合后这些列会自动保留原有的分类类型,无需额外操作。

补充:如果分组后列成了索引怎么办?

要是你忘记加as_index=False,分组列会变成结果的索引,这时候只需要调用reset_index()就能把它们转回普通列:

agg_result = df.groupby(['treatment', 'Metadata_A', 'Metadata_B'])['ratio'].mean().reset_index()

示例结果(基于你提供的DataFrame片段)

聚合后你会得到类似这样的结果,所有分类变量都被保留,同时对应每个分组的ratio均值:

treatmentMetadata_AMetadata_Baverage_ratio
AB_cmpd_01B10154265.937500
AB_cmpd_01B102107364.750000
AB_cmpd_01B10395766.500000
UTB11165056.600000
UTB11278409.600000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:56:30