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