#python #pandas
Вопрос:
У меня есть фрейм данных, в котором есть следующие записи
Я хочу сгенерировать 5 случайных значений переменных элементов A и B, которые попадают в указанные значения (минимальные и максимальные значения для каждого столбца переменных) конкретного элемента (например, A) по всем переменным этого элемента. Таким образом, выходной кадр данных будет выглядеть примерно так
Ответ №1:
IIUC, используйте melt
для выравнивания вашего groupby
фрейма данных по («Элемент», «Переменная»). Теперь у вас есть интервал для каждой группы (макс-мин), поэтому вы можете apply
np.random.uniform
создавать свой массив значений. Наконец, explode
это массивы для расширения значений в строках, прежде reset_index
чем получить исходную форму вашего фрейма данных.
data = {'Item': {0: 'A', 1: 'A', 2: 'B', 3: 'B'}, 'Variable1': {0: 21.3, 1: 18.4, 2: 12.3, 3: 9.4}, 'Variable2': {0: 19.4, 1: 17.2, 2: 11.6, 3: 10.2}} df = pd.DataFrame(data) out = df.melt('Item').groupby(['Item', 'variable'])['value'] .apply(lambda x: np.random.uniform(*x, 5)).unstack('variable') .explode(['Variable1', 'Variable2']).reset_index() out = pd.concat([df, out], ignore_index=True)
Выход:
gt;gt;gt; out Item Variable1 Variable2 0 A 21.3 19.4 1 A 18.4 17.2 2 B 12.3 11.6 3 B 9.4 10.2 4 A 19.229454 19.043591 5 A 20.543758 17.635435 6 A 19.534439 17.327745 7 A 19.423698 17.435615 8 A 19.411263 18.744932 9 B 11.638036 11.04916 10 B 9.404162 11.348977 11 B 11.230541 10.418873 12 B 11.136906 11.25763 13 B 12.244807 11.215597