Один из подходов - использовать Series.repeat
для обоих столбцов, а для второго умножить на случайные выборки из распределения дирихле, используя numpy.random.dirichlet
, поскольку мы знаем, что они будут в сумме составлять 1
:
import numpy as np
n = 3
random_dist = np.random.dirichlet(np.ones(n), size=df.shape[0])
df = pd.DataFrame({'DATE' : df.DATE.repeat(n),
'AMOUNT' : df.AMOUNT.repeat(n).mul(random_dist.ravel())
})
print(df)
DATE AMOUNT
0 20170101 36751.437762
0 20170101 3592.760077
0 20170101 9655.802161
1 20170102 28771.004963
1 20170102 17277.411089
1 20170102 8951.583948
2 20170103 6502.473089
2 20170103 49928.084247
2 20170103 3569.442664
3 20170104 5185.404276
3 20170104 54048.869887
3 20170104 5765.725837
4 20171231 70684.665661
4 20171231 57444.889083
4 20171231 21870.445257
Мы могли бы проверить, что выше все в порядке с:
df.groupby('DATE').AMOUNT.sum()
DATE
20170101 50000.0
20170102 55000.0
20170103 60000.0
20170104 65000.0
20171231 150000.0
Name: AMOUNT, dtype: float64
И где:
print(random_dist)
array([[0.73502876, 0.0718552 , 0.19311604],
[0.52310918, 0.31413475, 0.16275607],
[0.10837455, 0.83213474, 0.05949071],
[0.07977545, 0.83152108, 0.08870347],
[0.4712311 , 0.38296593, 0.14580297]])
print(random_dist.sum(1))
array([1., 1., 1., 1., 1.])