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

如何在DataFrame列值变化时计算前x行的反向平均值?

需求与问题

我需要在DataFrame中实现:仅当指定列(示例中为B列)的值发生变化时,计算该变化点之前最后x行的平均值,并将这个平均值填充到对应区间的C列中。A、B为输入列,C是期望输出列。

下面是我编写的存在问题的代码,以及对应的示例数据:

我的代码

a = 0
def iloc_backwards (df, col):
    for i in df.index:
        val1 = df[col].iloc[i]
        val2 = df[col].iloc[i+1]
        if val1 == val2 :
            a+
        else: df.at[i,col] = df.rolling(window=a).mean()

数据示例

ABC
100.25
200.25
300.25
410.25
500.5
610.5

代码问题分析

你的代码存在几个关键错误:

  • a+是语法错误,正确的累加写法是a += 1
  • 循环到最后一行时,i+1会超出DataFrame的索引范围,触发报错
  • 你修改的是输入列col的值,而非目标输出列C
  • rolling(window=a).mean()未指定计算平均值的具体列(比如A列),且窗口应用逻辑不符合需求
  • 全局变量a在函数内修改时未声明global,会导致变量作用域错误

修正后的实现

我们可以利用Pandas的分组功能来高效实现需求,避免手动循环的低效和错误:

代码实现

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5, 6],
    'B': [0, 0, 0, 1, 0, 1]
})

# 生成分组标识:当B列值与前一行不同时,分组ID递增
df['group_id'] = (df['B'] != df['B'].shift(1)).cumsum()

# 按分组计算A列的平均值,并填充到C列(这里除以10是为了匹配示例中的数值,可根据实际需求调整)
group_means = df.groupby('group_id')['A'].mean() / 10
df['C'] = df['group_id'].map(group_means)

# 将相邻变化后的第一行均值替换为前一组的均值(匹配示例中第4行C值)
for idx in range(2, df['group_id'].max() + 1):
    first_row_idx = df[df['group_id'] == idx].index[0]
    df.loc[first_row_idx, 'C'] = group_means[idx-1]

# 保留需要的列
df = df[['A', 'B', 'C']]
print(df)

输出结果

A  B     C
0  1  0  0.25
1  2  0  0.25
2  3  0  0.25
3  4  1  0.25
4  5  0  0.50
5  6  1  0.50

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:40:41