我为一系列均值和标准偏差创建了正态分布。每个分发都需要返回到数据框的一列。
dat
mu sigma
0 0.0 0.1
1 0.1 0.1
2 0.2 0.1
3 0.3 0.1
...
100 0.9 0.9
N = 10000
new = pd.DataFrame()
for index, row in dat.iterrows():
q = np.random.normal(row['mu'], row['sigma'],N)
new[index] = q
我需要将每个分布截断到(0,1)的范围。实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
使用clip()
方法:
new = new.clip(0,1)
如果你想用nan替换
import numpy as np
ts.clip(0,1).replace([0,1],np.nan)
答案 1 :(得分:0)
对于性能,特别是在处理数值数据时,我建议在数组级别工作。这是遵循该哲学并使用masking
分配新值的一种方法 -
arr = new.values
arr[(arr < 0 ) | (arr > 1)] = np.nan
此外,当我们将值提取为数组时,我们在那里进行查看。因此,所有指定的值都直接分配给原始数据帧。
让我们看一下示例运行以明确事项 -
In [98]: new
Out[98]:
0 1 2 3
0 -0.043621 0.130358 0.080129 0.328385
1 0.254040 0.182079 0.196277 0.200776
2 -0.095340 0.079365 0.087692 0.248947
3 -0.121635 -0.034989 0.234536 0.247606
4 0.156337 0.164760 0.202639 0.326892
In [99]: arr = new.values
In [100]: arr[(arr < 0 ) | (arr > 1)] = np.nan
In [101]: new
Out[101]:
0 1 2 3
0 NaN 0.130358 0.080129 0.328385
1 0.254040 0.182079 0.196277 0.200776
2 NaN 0.079365 0.087692 0.248947
3 NaN NaN 0.234536 0.247606
4 0.156337 0.164760 0.202639 0.326892