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

如何在DataFrame中按组生成符合指定规则的average列

问题描述

现有如下DataFrame:

idvalue
a2
a4
a3
a5
b1
b4
b3
c1
cnan
c5

需要生成包含新列average的结果DataFrame,取值规则如下:

  • 按id执行group-by分组
  • 每组中average列的首行值等于对应行的value值
  • 组内其他行的average值为该之前所有value行(不含当前值)的均值

最终目标结果DataFrame如下:

idvalueaverage
a22
a42
a33
a53
b11
b41
b32.5
c11
cnan1
c51
解决方案

可以通过Pandas分组结合累积统计与移位操作实现需求,代码如下:

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'id': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
    'value': [2, 4, 3, 5, 1, 4, 3, 1, np.nan, 5]
})

def calculate_avg(group):
    # 计算组内value的累积和(自动忽略NaN)
    cum_sum = group['value'].cumsum()
    # 统计组内到当前行的非NaN值数量
    cum_count = group['value'].notna().cumsum()
    # 首行直接取value,其他行用前序所有行的均值
    group['average'] = np.where(
        cum_count == 1,
        group['value'],
        (cum_sum.shift(1) / cum_count.shift(1)).fillna(group['value'])
    )
    return group

# 分组应用计算逻辑
result_df = df.groupby('id', group_keys=False).apply(calculate_avg)

print(result_df)

代码说明

  • cumsum():计算每组value的累积和,自动跳过NaN值
  • notna().cumsum():统计每组截至当前行的有效数值(非NaN)数量
  • shift(1):将累积统计结果向下偏移一行,让当前行能获取到之前所有行的总和与数量
  • np.where:区分首行与其他行的计算逻辑,首行直接取原value,其他行用前序数值的均值填充

运行代码后得到的结果与目标DataFrame完全一致。

内容的提问来源于stack exchange,提问作者ii mm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:27:24