首页 > 解决方案 > 从带有权重的 pandas DataFrame 中随机选择一行

问题描述

我正在尝试根据提供的权重从 pandas DataFrame 中随机选择一行。我尝试对这些参数使用 .sample() 方法,但无法使语法正常工作:

import pandas as pd

df = pd.DataFrame({
    'label': [1,0,1,-1],
    'ind': [2,3,6,8],
})

df.sample(n=1, weights=[0.5, 0.4, 0.1], axis=0)

标签是 1,0 和 -1,我想为每个标签分配不同的权重以进行随机选择。

标签: pythonpython-3.xpandas

解决方案


您应该缩放权重,使其与预期分布相匹配:

weights = {-1:0.1, 0:0.4, 1:0.5}

scaled_weights = (pd.Series(weights) / df.label.value_counts(normalize=True))

df.sample(n=1, weights=df.label.map(scaled_weights) )

具有 10000 个样本的测试分布

(df.sample(n=10000, replace=True, random_state=1,
           weights=df.label.map(scaled_weights))
   .label.value_counts(normalize=True)
)

输出:

 1    0.5060
 0    0.3979
-1    0.0961
Name: label, dtype: float64

推荐阅读