如何解决用截断的标准随机数填充NaN,并使用数据框各列的预定义平均值,标准差,最小值和最大值
我想问问是否有一种方法可以根据每列的平均值,标准差(std),最小值和最大值来用截断的正常随机数填充每一列中的NaN。
假设我们有一个数据框,其第一列具有以下平均值,std,min和max值
count 846.000000
mean 13.385747
std 13.059811
min -7.171171
25% 2.944954
50% 11.021540
75% 24.119154
max 59.000000
我想用从上述平均值,std,min和max值生成的截断的正常随机数填充这些NaN单元。然后对于第二列,它具有一组不同的均值,std,min和max,我想用从其均值,std,min和max集合中生成的截短的正常随机数填充第二列中的NaN单元,以此类推。
对于我的问题,我大约有301列。我尝试了以下方式,但是遇到错误
def fillNaN_with_unifrand(df):
a = df.values
m = np.isnan(a) # mask of NaNs
lower,upper = df.min(),df.max()
mu,sigma = df.mean(),df.std()
a[m] = stats.truncnorm.rvs((lower - mu) / sigma,(upper - mu) / sigma,loc=mu,scale=sigma,size=m.sum())
return df
for i in range(len(dataset_pre_syn_large_std_df.columns)):
dataset_df[dataset_df.columns[i]] = fillNaN_with_unifrand(dataset_pre_syn_large_std_df[dataset_pre_syn_large_std_df.columns[i]])
我遇到的错误是
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-000fe9486bee> in <module>
13
14 for i in range(len(dataset_pre_syn_large_std_df.columns)):
---> 15 dataset_df[dataset_df.columns[i]] = fillNaN_with_unifrand(dataset_pre_syn_large_std_df[dataset_pre_syn_large_std_df.columns[i]])
16
17 dataset_df.to_csv("test_4.csv")
<ipython-input-13-000fe9486bee> in fillNaN_with_unifrand(df)
4 lower,df.max()
5 mu,df.std()
----> 6 a[m] = stats.truncnorm.rvs((lower - mu) / sigma,size=m.sum())
~/anaconda3/envs/python3/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py in rvs(self,*args,**kwds)
964 cond = logical_and(self._argcheck(*args),(scale >= 0))
965 if not np.all(cond):
--> 966 raise ValueError("Domain error in arguments.")
967
968 if np.all(scale == 0):
ValueError: Domain error in arguments.
还有其他方法可以实现我想要的吗?还是可以调试错误?
请告知。
非常感谢您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。