为了进一步探讨,并在@mozway的回答基础上拓展,如果数据中存在接近最小值(如-95)或最大值(如58)的数值时,由于异常值的存在,计算得到的方差将不再具有代表性。另一种方法是通过四分位数范围(IQR)来移除异常值:
q = df.quantile([0.25, 0.75], axis=1).T
q1, q3 = q[0.25], q[0.75]
iqr = q3 - q1
lb, ub = q1 - 1.5 * iqr, q3 + 1.5 * iqr
df['sd'] = df.where(df.ge(lb, axis=0) & df.le(ub, axis=0)).std(axis=1)
输出结果:
>>> df
a b c d e sd
0 -100 2 3 60 4 1.0
1 7 5 -50 9 130 2.0
>>> q
0.25 0.75
0 2.0 4.0
1 5.0 9.0
>>> lb # 只保留大于等于下界阈值的值
0 -1.0
1 -1.0
dtype: float64
>>> ub # 只保留小于等于上界阈值的值
0 7.0
1 15.0
dtype: float64
>>> df.where(df.ge(lb, axis=0) & df.le(ub, axis=0))
a b c d e
0 NaN 2 3.0 NaN 4.0
1 7.0 5 NaN 9.0 NaN