我有一个长度约为 12000 的数组,类似于array([0.3, 0.6, 0.3, 0.5, 0.1, 0.9, 0.4...]). 此外,我在数据框中有一列提供了类似的值2,3,7,3,2,7...。列的长度是 48,这些值的总和是 36。
array([0.3, 0.6, 0.3, 0.5, 0.1, 0.9, 0.4...])
2,3,7,3,2,7...
我想分配值,这意味着 12000 长度的数组由特定的每个值分配。例如,该列中的第一个值 (= 2) 得到它自己的数组12000*(2/36)(可能是 [0.3, 0.6, 0.3]),第二个值 (= 3) 得到它的数组12000*(3/36),并且它的值在第一个值之后继续(类似于 [0.5, 0.1, 0.9, 0.4])等等。
12000*(2/36)
12000*(3/36)
import pandas as pd import numpy as np # mock some data a = np.random.random(12000) df = pd.DataFrame({'col': np.random.randint(1, 5, 48)}) indices = (len(a) * df.col.to_numpy() / sum(df.col)).cumsum() indices = np.concatenate(([0], indices)).round().astype(int) res = [] for s, e in zip(indices[:-1], indices[1:]): res.append(a[round(s):round(e)]) # some tests target_pcts = df.col.to_numpy() / sum(df.col) realized_pcts = np.array([len(sl) / len(a) for sl in res]) diffs = target_pcts / realized_pcts assert 0.99 < np.min(diffs) and np.max(diffs) < 1.01 assert all(np.concatenate([*res]) == a)