使用来自pythons pandas数据帧的数据来从正态分布中采样

时间:2016-03-18 14:14:37

标签: python pandas

我正在尝试使用存储在pandas DataFrame中的均值和标准偏差从正态分布中进行采样。

例如:

means= numpy.arange(10)
means=means.reshape(5,2)

产生:

   0  1
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

sts=numpy.arange(10,20)
sts=sts.reshape(5,2)

产生

    0   1
0  10  11
1  12  13
2  14  15
3  16  17
4  18  19

如何生成具有相同形状的另一个pandas数据帧,但使用相应的均值和标准偏差从正态分布中采样值。

即。此新数据框的位置0,0将使用mean=0standard deviation=10从正态分布中进行抽样,依此类推。

到目前为止我的功能:

    def make_distributions(self):
        num_data_points,num_species= self.means.shape
        samples=[]
        for i,j in zip(self.means,self.stds):
            for k,l in  zip(self.means[i],self.stds[j]):
                samples.append( numpy.random.normal(k,l,self.n) )

将从我的发行版中抽样,但我很难将数据放回到与平均值和标准差dfs相同的形状数据帧中。有没有人对如何做到这一点有任何建议?

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以使用numpy.random.normal从随机正态分布中进行采样 IIUC,那么这可能是最简单的,利用broadcasting

<li ng-init="bg = controllerName.underQBar(work.options)">

检查它是否有效:

import numpy as np
np.random.seed(1) # only for demonstration
np.random.normal(means,sts)

array([[ 16.24345364,  -5.72932055],
       [ -4.33806103, -10.94859209],
       [ 16.11570681, -29.52308045],
       [ 33.91698823,  -5.94051732],
       [ 13.74270373,   4.26196287]])

如果您需要pandas DataFrame:

np.random.seed(1)
print np.random.normal(0,10)
print np.random.normal(1,11)

16.2434536366
-5.72932055015

答案 1 :(得分:1)

我将使用字典构建此数据帧。假设指数和列与平均值和标准相同:

import itertools
samples = means * 0
samples = samples.astype(object)

for i,j in itertools.product(means.index, means.columns):
    samples.set_value(i,j,numpy.random.normal(means.ix[i,j],stds.ix[i,j],2))

或者重置DataFrame的dtype并重新分配值:

{{1}}