如何按year分组计算排除当前key的条件均值(Conditional mean)?
解决方法:计算同年度排除当前key后的均值
我明白你的需求了——要对每个year分组,然后针对每个key,计算该年度内排除所有同key行之后val列的均值。这个需求可以通过先计算年度整体的统计量,再结合每个key的统计量来推导,不需要复杂的循环,用pandas的分组聚合就能高效实现。
步骤分解与代码实现
首先,我们先把你的示例DataFrame定义好:
import pandas as pd df = pd.DataFrame({ 'year': ['2019', '2019', '2019', '2019', '2020', '2020', '2020'], 'key': ['a', 'a', 'b', 'c', 'd', 'e', 'f'], 'val': [3, 4, 3, 5, 6, 1, 2] })
接下来分三步完成计算:
计算每个年度的总val和总数据量
我们需要知道每个year下所有val的总和,以及一共有多少行数据:year_stats = df.groupby('year')['val'].agg(['sum', 'count']).rename(columns={'sum': 'year_sum', 'count': 'year_count'}) df = df.merge(year_stats, on='year', how='left')计算每个(year, key)组合的val和与数据量
然后获取每个key在对应年度内的val总和,以及该key的行数:key_stats = df.groupby(['year', 'key'])['val'].agg(['sum', 'count']).rename(columns={'sum': 'key_sum', 'count': 'key_count'}) df = df.merge(key_stats, on=['year', 'key'], how='left')推导目标均值
排除当前key后的均值,等于年度总val减去当前key的val总和,除以年度总行数减去当前key的行数:df['mean_except_current_key'] = (df['year_sum'] - df['key_sum']) / (df['year_count'] - df['key_count'])整理成你需要的格式
最后我们去重并调整显示格式,得到目标结果:result = df.drop_duplicates(subset=['year', 'key'])[['year', 'key', 'mean_except_current_key']].round(2) # 设置year为索引,让显示更贴近你的期望 result = result.set_index('year') print(result)
运行结果
执行上述代码后,输出的结果和你期望的完全一致:
key mean_except_current_key year 2019 a 4.00 2019 b 4.00 2019 c 3.33 2020 d 1.50 2020 e 4.00 2020 f 3.50
为什么这个方法高效?
这种方式避免了对每个key进行循环过滤,而是利用分组聚合一次性计算所有统计量,时间复杂度是O(n),对于大数据量的场景也能快速处理。
内容的提问来源于stack exchange,提问作者North
相关产品推荐
相关产品推荐

