Генерация случайных чисел с использованием значений категориальных переменных в рамках фрейма данных

#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