概率变异数据帧



给定

pd.DataFrame({'feature': [0.5,0.1,0.3,0.2,0.6,0.4,0.3], 'label': [0,1,2,2,1,2,0]})

我想应用以下规则:对于feature大于0.2的所有行,其标签更改为2的可能性为60%。否则,它将保持不变。

我的解决方案是:

df.loc[df.feature > 0.2, 'label'] = [
np.random.choice(x, p=(0.6,0.4)) for x in zip(np.full(len(df.feature > 0.2), fill_value=2), df.loc[df.feature > 0.2, 'label'])]

有没有一种更简单、矢量化的方法可以做到这一点?

Idea像这个解决方案一样按百分比设置掩码,并且只设置更大的选定值,如0.2:

N = 2
m = df.feature > 0.2
mask = np.random.choice([True, False], m.sum(), p=[0.6, 0.4])
df.loc[m, 'label'] = np.where(mask, N, df.loc[m, 'label'])