问题描述
我想问问是否有一种方法可以根据每列的平均值,标准差(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 (将#修改为@)