Pandas自定义函数计算标准差倍数时部分行未处理问题求助
1. 链式索引导致赋值失效
你通过myDF['Dev From avg'][j]修改DataFrame元素的方式属于链式索引,这是Pandas明确不推荐的操作。这种写法会让Pandas无法确定你修改的是原DataFrame的视图还是临时副本,多数情况下赋值操作只会作用在副本上,原DataFrame的对应行根本不会被更新,导致后续行始终保留初始的"None"值。
正确的行定位应该使用.iloc,比如myDF.iloc[j, myDF.columns.get_loc('Dev From avg')] = k,确保修改的是原DataFrame的元素。
2. 极端值触发死循环,中断后续处理
如果数据中存在离均值极远的异常值,比如某个值i远大于avg + k*snd(或远小于avg + k*snd),你的while循环会无限递增/递减k,永远无法触发break条件。程序会卡在这个循环中,后续的j += 1和行处理逻辑完全无法执行,导致后面所有行的Dev From avg列都停留在初始值。
举个例子:假设avg=5,snd=1,而某个i=1000,那么k需要从1递增到995才能满足1000 <= 5 + 995*1,循环要执行995次;如果是更大的极端值,循环会持续更久,甚至理论上可能无限运行。
3. 列类型不一致引发隐性问题
你初始化列时赋值为字符串"None",但后续赋值的是整数,这会强制列的 dtype 变为object。这种类型不仅内存利用率低,还可能在后续的统计、可视化操作中引发类型兼容问题。
Pandas的核心优势是向量化运算,完全不需要用循环处理这类逻辑,效率更高且避免循环的各种坑:
import numpy as np def det_dev(col, myDF): avg = col.mean() snd = col.std() # 处理标准差为0的特殊情况(列中所有值相同) if snd == 0: myDF['Dev From avg'] = 0 return # 计算每个值与均值的标准差距离 dev = (col - avg) / snd # 对正数向上取整,负数向下取整,得到对应的标准差倍数 myDF['Dev From avg'] = np.where(dev >= 0, np.ceil(dev), np.floor(dev)).astype(int)
内容的提问来源于stack exchange,提问作者Diamoniner12345

