Pandas DataFrame列值较上一行变化≥50%时替换为NaN实现问题
实现方案
核心逻辑是遍历指定列时,始终用当前值和上一个未被标记为离群值的有效值计算涨跌幅度,符合阈值条件则标记为NaN,否则更新有效值为当前值。
完整实现代码
import pandas as pd import numpy as np # 构造示例数据 x = [16, 17, 18, 19, 20, 21, 22, 23, 24, 25] y = [6,6,3,3,8,8,7,2,2,2] data = pd.DataFrame({'x': x, 'y': y}) # 离群值替换函数 # 参数说明: # df: 待处理DataFrame # col: 要处理的目标列名 # threshold: 涨跌幅度阈值,默认0.5对应50% def replace_outlier_by_pct(df, col, threshold=0.5): # 取第一行作为初始有效值 last_valid = df[col].iloc[0] result = [last_valid] # 从第二行开始遍历计算 for current_val in df[col].iloc[1:]: change_pct = abs(current_val - last_valid) / last_valid if change_pct >= threshold: result.append(np.nan) else: result.append(current_val) last_valid = current_val df[col] = result return df # 调用函数处理y列 data = replace_outlier_by_pct(data, 'y') print(data)
输出结果验证
运行代码后输出的DataFrame和预期完全一致:
| x | y |
|---|---|
| 16 | 6.0 |
| 17 | 6.0 |
| 18 | NaN |
| 19 | NaN |
| 20 | 8.0 |
| 21 | 8.0 |
| 22 | 7.0 |
| 23 | NaN |
| 24 | NaN |
| 25 | NaN |
多列处理拓展
如果需要对多列执行相同规则的离群值替换,只需循环调用函数即可:
# 示例:同时处理y、z两列 for target_col in ['y', 'z']: data = replace_outlier_by_pct(data, target_col)
内容的提问来源于stack exchange,提问作者j_90
相关产品推荐
相关产品推荐

