从带有权重的熊猫数据框中随机选择一行

时间:2020-07-21 14:01:53

标签: python python-3.x pandas

我正在尝试根据提供的权重从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,我想为每个标签分配不同的权重以进行随机选择。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

对于每一行,将所需的重量除以df中该标签的频率:

weights=df['label'].replace({1:0.5,0:0.4,-1:0.1})/df.groupby('label')['label'].transform('count')

df.sample(n=1, weights=weights, axis=0)

答案 2 :(得分:0)

您可以尝试以下代码。它将字典中所需的权重分配给df中的行(假设您按这样的顺序给它们)。如果您希望权重取决于元素数量-您可以将lambda替换为更复杂的函数。

w = df['label'].apply( lambda x: {-1:0.5, 0:0.4, 1:0.1}[x] )
df.sample(n=1, weights=w, axis=0)
相关问题