应用numpy随机选择对熊猫df列中具有概率的类别进行随机化



只是试图在数据帧中生成一个新列,它根据位于同一行中其他列的概率取值1或0。

具有伪数据:df = pd.DataFrame({'a': [.1, .2, .3, .4], 'b': [.9, .8, .7, .6']})

我希望添加第三列c,例如,在第一行中,它为1的概率为.1,为0的概率为.9。等等。

第一次尝试是定义一个函数并使用apply:

def randomiser(x):
return np.random.choice([1,0], size=(1, 1), p=[df.loc[[x]]['a'], -df.loc[[x]]['b']])
df['probability'] = df.apply(lambda x: randomiser(x), axis=1)

然而,这会引发一个关于向p提供两个多值的错误,所以我认为它迭代不正确。

第二次我尝试了for循环:

for row in df.iterrows():
row['probability'] = np.random.choice([1,0], size=(1, 1), p=[df.loc[[row]]['a'], -df.loc[[row]]['b']])

但这会导致TypeError抱怨系列对象是可变的。

最后我尝试将相关列拉出到元组或列表中,但结果相似。

有什么想法吗?感谢

由于apply()的工作方式,您不需要指定df.loc[],必须使用x和要从中获取值的列的名称。尝试以下操作:

df = pd.DataFrame({'a': [.1, .2, .3, .4], 'b': [.9, .8, .7, .6]})
def randomiser(x):
return np.random.choice([1,0], size=(1, 1), p=[x['a'], x['b']])[0][0]
df['probability'] = df.apply(lambda x: randomiser(x), axis=1)

该输出:

a    b  probability
0  0.1  0.9            1
1  0.2  0.8            0
2  0.3  0.7            0
3  0.4  0.6            1
df["probability"] = [np.random.choice([1, 0], p=probs).item()
for probs in df[["a", "b"]].values]

通过这种列表理解,我们将dfnp.random.choice的每一行作为概率,并分别从[1, 0]中进行选择(.item用于从1项数组中获取标量(。

获取(例如(

a    b  probability
0  0.1  0.9            0
1  0.2  0.8            0
2  0.3  0.7            0
3  0.4  0.6            1

最新更新