截断规范化分布Python / Pandas

时间:2017-03-22 15:50:46

标签: python pandas numpy normal-distribution

我为一系列均值和标准偏差创建了正态分布。每个分发都需要返回到数据框的一列。

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)的范围。实现这一目标的最佳方法是什么?

2 个答案:

答案 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