Pandas多索引DataFrame:带行过滤的分组均值映射需求
解决方案
可以通过两种方法实现需求,既保留原DataFrame的所有行,又能按指定分组计算目标均值并映射到每一行:
方法一:使用groupby+transform(简洁写法)
利用transform方法的特性,它会返回与原DataFrame行数一致的结果,同时在分组内仅对EST_UNIV == 1的行计算均值:
import pandas as pd # 假设你的多索引DataFrame名为df df['EY_group_mean'] = df.groupby(['date', 'SECTOR'])['EY'].transform( lambda x: x[df.loc[x.index, 'EST_UNIV'] == 1].mean() )
这里transform会遍历每个['date','SECTOR']分组,在组内筛选出EST_UNIV == 1的EY值计算均值,再将该均值填充到组内的每一行,包括EST_UNIV == 0的行。
方法二:先计算分组均值再合并(高效写法)
如果数据量较大,这种方法的性能更优,步骤如下:
- 先筛选出符合条件的行,计算分组均值并保存为单独的DataFrame:
mean_data = df[df['EST_UNIV'] == 1].groupby(['date', 'SECTOR'])['EY'].mean().reset_index(name='EY_group_mean')
- 通过
merge将均值数据合并回原DataFrame,使用how='left'确保保留原数据的所有行:
df = df.merge(mean_data, on=['date', 'SECTOR'], how='left')
两种方法最终都会在原DataFrame中新增一列(比如EY_group_mean),每一行都会对应其所在['date','SECTOR']组的目标均值,不会丢失任何原始行。
内容的提问来源于stack exchange,提问作者Bijan Beheshti
相关产品推荐
相关产品推荐

