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

如何按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]
})

接下来分三步完成计算:

  1. 计算每个年度的总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')
    
  2. 计算每个(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')
    
  3. 推导目标均值
    排除当前key后的均值,等于年度总val减去当前key的val总和,除以年度总行数减去当前key的行数:

    df['mean_except_current_key'] = (df['year_sum'] - df['key_sum']) / (df['year_count'] - df['key_count'])
    
  4. 整理成你需要的格式
    最后我们去重并调整显示格式,得到目标结果:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:27:42