更新数据框以包含总和为1的随机值

时间:2017-05-26 18:15:26

标签: python pandas numpy

此代码:

data1 = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
        'two' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
        'three' : pd.Series([1., 1., 4.], index=['a', 'b', 'c'])}

df = pd.DataFrame(data1)

thirds = pd.DataFrame(1 / 3, index=df.index, columns=df.columns)

print(thirds)

打印:

        one     three       two
a  0.333333  0.333333  0.333333
b  0.333333  0.333333  0.333333
c  0.333333  0.333333  0.333333

预期。

我正在尝试更改df数据框,以便修改系列值,使它们总和为1.最接近的是:

import numpy as np, numpy.random

data2 = {'one' : pd.Series((np.random.dirichlet(np.ones(3),size=1).flatten()), index=['a', 'b', 'c']),
         'two' : pd.Series((np.random.dirichlet(np.ones(3),size=1).flatten()), index=['a', 'b', 'c']),
         'three' : pd.Series((np.random.dirichlet(np.ones(3),size=1).flatten()), index=['a', 'b', 'c'])}

random01 = pd.DataFrame(d2)

print(random01)

打印哪些:

        one     three       two
a  0.173359  0.143096  0.254052
b  0.078862  0.589361  0.700310
c  0.747778  0.267543  0.045639

这适用于3行数据,但如何将相同的修改应用于N行?那么,不是对数组中的值进行硬编码,而是动态生成它们?

1 个答案:

答案 0 :(得分:2)

只需生成您需要的任何分布的通用随机数(例如随机均匀),然后将整个系列除以其总和。

示例:

# Generate 10 random numbers uniformly between 10 and 1.
random_stuff = pd.Series(np.random.rand(10))
# Divide by their sum
random_stuff /= random_stuff.sum()