为0-1区间的Pandas列添加不越界的正态噪声
解决方法
方法一:用海象运算符(Python 3.8+)
直接在lambda里用海象运算符:=生成一次噪声值,同时完成判断和赋值,避免两次生成随机数的问题:
import numpy as np df['val_x'] = df['val_x'].apply(lambda x: (noise := x + np.random.normal(0, 0.2)) if 0 < noise < 1 else x)
这里noise变量只生成一次,判断和最终赋值用的是同一个随机噪声,完全符合需求。
方法二:定义独立函数(兼容所有Python版本)
如果你的Python版本低于3.8,没法用海象运算符,就写个简单的小函数,逻辑更直观:
import numpy as np def add_valid_noise(x): noisy_val = x + np.random.normal(0, 0.2) return noisy_val if 0 < noisy_val < 1 else x df['val_x'] = df['val_x'].apply(add_valid_noise)
这个函数里只生成一次噪声值,判断后返回合法的结果,也能解决你之前的问题。
为什么之前的代码不行?
- 第一次的lambda里两次调用
np.random.normal,会生成两个完全独立的随机数,导致判断时的噪声和实际添加的噪声不是同一个,结果混乱。 - 尝试用默认参数的方式不可行,因为lambda的默认参数是在定义lambda时就计算好的,不是每次调用时动态计算,而且不能用参数
x来定义默认参数的值。
内容的提问来源于stack exchange,提问作者xtc_
相关产品推荐
相关产品推荐

