如何在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()
数据示例
| A | B | C |
|---|---|---|
| 1 | 0 | 0.25 |
| 2 | 0 | 0.25 |
| 3 | 0 | 0.25 |
| 4 | 1 | 0.25 |
| 5 | 0 | 0.5 |
| 6 | 1 | 0.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
相关产品推荐
相关产品推荐

