Pandas:根据条件创建一个包含随机值的新列

时间:2014-11-24 19:43:39

标签: pandas

我在尝试之前尝试过阅读类似的问题,但我仍然难过。 任何帮助都是适用的。

输入: 我有一个带有标记为“ radon ”的列的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)

1 个答案:

答案 0 :(得分:3)

一种方法是在使用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

你可能会变得更聪明,只会产生你实际需要的随机数,但是输入这个句子可能需要更长的时间才能保存。 (生成~100个数字需要9毫秒。)

如果您使用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