我有一个数据框架,我想在一个新列中创建随机数。随机数必须满足两个约束条件:
- 随机数必须为指定的和(本例中为300)
- 对于每个观测值,随机数必须而不是超出约束列中的值。
在下面的例子中,因为和是300,并且随机数没有超过约束列,所以约束被满足了。
例子:
GEOID | CONSTRAINT | RANDOM | 010010000001 | 100 | 80 |
---|---|---|
010010000002 | 50 | 40 |
010010000003 | 75 | 60 |
010010000004 | 75 | 60 |
010010000005 | 100 | 60 |
您可以使用多项分布来构建近似答案:
def sample(total, constraints):
import numpy as np
rng = np.random.default_rng()
samples = rng.multinomial(total, constraints / constraints.sum(), size=100)
return next(val for val in samples if np.all(val < constraints))
df["RANDOM"] = sample(300, df["CONSTRAINT"].values)
print(df)
GEOID CONSTRAINT RANDOM
0 10010000001 100 81
1 10010000002 50 42
2 10010000003 75 57
3 10010000004 75 53
4 10010000005 100 67
感谢@Michael Szczesny测试这个解决方案。
解决这个问题的关键在于(引用自numpy文档):
它的值,X_i = [X_0, X_1,…], X_p],表示次数结果是i。
详情见此博客。