用遵循特定分布的随机生成数替换一些数据

Replace some data with random generated number that follows the particular distribution

我有一些描述人们年龄的肮脏数据。间隔是从-7000到2015。我已经将值更改为

df_members['bd'] = df_members.bd.apply(lambda x: -99999 if float(x)<=1 else x )
df_members['bd'] = df_members.bd.apply(lambda x: -99999 if float(x)>=100 else x )

下图显示了数据。

我通过排除值 -99999

来绘制图形

如何在不影响分布的情况下替换-99999 的值,如第二张图所示?年龄在 15-50 岁之间,平均值约为 29 岁,出生日期的中位数 = 28.0。我计划生成 15-50 之间的随机数,但我担心会破坏原始分布。

https://stats.stackexchange.com/questions/78063/replacing-outliers-with-mean

关于为什么通常不这样做的快速入门。无论如何:

我们将根据我们的样本均值和标准差生成一组 numpy.random.normal 的新值,并用其中一个新的 "random normal" 样本替换超出我们选择值的任何值。

df_members['bd'] = df_members.bd.apply(lambda x: np.rint((np.random.normal(bd_mean, bd_sd))) if x==-999999 else x )

并将 "x==-99999" 修改为您需要查找要替换内容的任何逻辑。

因此,bd_mean 和 bd_sd 也可以内联计算:

df_members['bd'] = df_members.bd.apply(lambda x: np.rint((np.random.normal(df_members.bd.mean(),df_members.bd.std())) if x>9999999 else x))

如果你觉得它是非正态分布,那么有很多不同的样本类型!看看这里: https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.random.html

感谢大家的编辑!