python - 如何根据熊猫数据框中包含的权重获得包含随机样本的列?
问题描述
我有一个超过一百万行的数据框。对于每一行,我有 4 列,包含权重。如何有效地对具有相应权重的每一行进行采样?我只想使用每行的权重为每行选择一个数字 1、2、3 或 4。现在我有这个for循环,但这需要太长时间。
df = pd.DataFrame({
'1': [0.155, 0.138, ...],
'2': [0.473, 0.307, ...],
'3': [0.291, 0.490, ...],
'4': [0.080, 0.064, ...],
'pick': ['']
})
for i in range(0, len(df)):
df['pick'][i] = random.choices([1,2,3,4], weights=[df['1'][i], df['2'][i], df['3'][i], df['4'][i]], k=1)
解决方案
尝试使用 numpy,它通常更快:
for i in range(len(df)):
df['pick'][i]=np.random.choice([1,2,3,4], 1, p=list(df.iloc[i,:4]))
但是,由于您的权重并不总是加到 1,请以这种方式更改某些列(例如第 4 列),之前:
df['4']=1-(df['1']+df['2']+df['3'])
输出:
1 2 3 4 pick
0 0.155 0.473 0.291 0.081 2
1 0.138 0.307 0.490 0.065 4