Панды: создайте новый столбец со случайными значениями, основанными на условных значениях.



Я пробовал читать подобные вопросы, прежде чем задавать, но я все еще в тупике.
Любая помощь истощается.



Входные данные:
У меня есть фрейм данных pandas со столбцом с надписью " радон ", который имеет значения в диапазоне: [0.5, 13.65]



Вывод:
Я хотел бы создать новый столбец, в котором все значения радона, которые = 0.5, изменяются на случайное значение между 0.1 и 0.5



Я попробовал это:



df['radon_adj'] = np.where(df['radon']==0.5, random.uniform(0, 0.5), df.radon)


Однако я получаю одно и то же случайное число для всех значений 0.5





Я попробовал и это. Он создает случайные числа, но оператор else не копирует исходные значения



df['radon_adj'] = df['radon'].apply(lambda x: random.uniform(0, 0.5) if x == 0.5 else df.radon)
512   1  

1 ответ:

Одним из способов было бы создать все случайные числа, которые вам могут понадобиться, прежде чем выбрать их с помощью where:

>>> df = pd.DataFrame({"radon": [0.5, 0.6, 0.5, 2, 4, 13]})
>>> df["radon_adj"] = df["radon"].where(df["radon"] != 0.5, np.random.uniform(0.1, 0.5, len(df)))
>>> df
   radon  radon_adj
0    0.5   0.428039
1    0.6   0.600000
2    0.5   0.385021
3    2.0   2.000000
4    4.0   4.000000
5   13.0  13.000000
Вы могли бы быть немного умнее и генерировать только столько случайных чисел, сколько вам действительно понадобится, но, вероятно, мне потребовалось бы больше времени, чтобы напечатать это предложение, чем вы сэкономили бы. (Мне требуется 9 мс, чтобы сгенерировать ~ 1M чисел.)

Ваш apply подход тоже сработал бы, если бы вы использовали x вместо df.radon:

>>> df['radon_adj'] = df['radon'].apply(lambda x: random.uniform(0.1, 0.5) if x == 0.5 else x)
>>> df
   radon  radon_adj
0    0.5   0.242991
1    0.6   0.600000
2    0.5   0.271968
3    2.0   2.000000
4    4.0   4.000000
5   13.0  13.000000

Comments

    Ничего не найдено.