Python 截断正态分布

Python 截断正态分布,python,pandas,numpy,normal-distribution,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)

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

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

使用
clip()
方法:

  new =  new.clip(0,1)
如果你想换成nan

import numpy as np
ts.clip(0,1).replace([0,1],np.nan)
使用
clip()
方法:

  new =  new.clip(0,1)
如果你想换成nan

import numpy as np
ts.clip(0,1).replace([0,1],np.nan)

对于性能,尤其是在处理数值数据时,我建议在数组级别工作。这里有一种方法遵循这一理念,并使用
掩蔽
来分配新值-

arr = new.values
arr[(arr < 0 ) | (arr > 1)] = np.nan
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
[98]中的
:新建
出[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
在[99]中:arr=new.values
在[100]中:arr[(arr<0)|(arr>1)]=np.nan
在[101]中:新的
出[101]:
0         1         2         3
0.130358 0.0801290.328385
1  0.254040  0.182079  0.196277  0.200776
2 NaN 0.079365 0.087692 0.248947
3楠楠0.234536 0.247606
4  0.156337  0.164760  0.202639  0.326892

对于性能,尤其是在处理数字数据时,我建议在数组级别工作。这里有一种方法遵循这一理念,并使用
掩蔽
来分配新值-

arr = new.values
arr[(arr < 0 ) | (arr > 1)] = np.nan
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
[98]中的
:新建
出[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
在[99]中:arr=new.values
在[100]中:arr[(arr<0)|(arr>1)]=np.nan
在[101]中:新的
出[101]:
0         1         2         3
0.130358 0.0801290.328385
1  0.254040  0.182079  0.196277  0.200776
2 NaN 0.079365 0.087692 0.248947
3楠楠0.234536 0.247606
4  0.156337  0.164760  0.202639  0.326892

我需要异常值为NaN,是否有同样简单的方法?我需要异常值为NaN,是否有同样简单的方法?发布的解决方案是否对您有效?发布的解决方案是否对您有效?