如何在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均值:
| treatment | Metadata_A | Metadata_B | average_ratio |
|---|---|---|---|
| AB_cmpd_01 | B10 | 1 | 54265.937500 |
| AB_cmpd_01 | B10 | 2 | 107364.750000 |
| AB_cmpd_01 | B10 | 3 | 95766.500000 |
| UT | B11 | 1 | 65056.600000 |
| UT | B11 | 2 | 78409.600000 |
内容的提问来源于stack exchange,提问作者Arnold Klein
相关产品推荐
相关产品推荐

