首页 > 解决方案 > 如何根据熊猫数据框中包含的权重获得包含随机样本的列?

问题描述

我有一个超过一百万行的数据框。对于每一行,我有 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)

标签: pythonpandas

解决方案


尝试使用 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

推荐阅读