Рекомендую использовать здесь np.select
.Вы устанавливаете свои условия, свои результаты, и вы готовы к работе.Однако, чтобы избежать итерации, но также , чтобы избежать присвоения одинакового случайного значения каждому столбцу, который удовлетворяет условию, создайте случайные значения, равные длине вашего DataFrame, и выберите из них:
Настройка
df = pd.DataFrame({
'Name': ['Chris', 'John'],
'Height': [72, 84],
'Pos': ['PG', 'C'],
'Weight': [165, 235],
'Shot': ['Amazing', 'Fair'],
'Points': [999, 25]
})
Name Height Pos Weight Shot Points
0 Chris 72 PG 165 Amazing 999
1 John 84 C 235 Fair 25
Теперь настройте диапазоны и свои условия (создайте столько, сколько вам нужно):
cond1 = df.Pos.eq('C') & df.Height.gt(80) & df.Weight.gt(200)
cond2 = df.Pos.eq('PG') & df.Height.lt(80) & df.Weight.lt(200)
range1 = np.random.randint(85, 100, len(df))
range2 = np.random.randint(50, 85, len(df))
df.assign(InsideScoring=np.select([cond1, cond2], [range1, range2]))
Name Height Pos Weight Shot Points InsideScoring
0 Chris 72 PG 165 Amazing 999 72
1 John 84 C 235 Fair 25 89
Теперь, чтобы убедиться, что это не присваивает значения более одного раза:
df = pd.concat([df]*5)
... # Setup the ranges and conditions again
df.assign(InsideScoring=np.select([cond1, cond2], [range1, range2]))
Name Height Pos Weight Shot Points InsideScoring
0 Chris 72 PG 165 Amazing 999 56
1 John 84 C 235 Fair 25 96
0 Chris 72 PG 165 Amazing 999 74
1 John 84 C 235 Fair 25 93
0 Chris 72 PG 165 Amazing 999 63
1 John 84 C 235 Fair 25 97
0 Chris 72 PG 165 Amazing 999 55
1 John 84 C 235 Fair 25 95
0 Chris 72 PG 165 Amazing 999 60
1 John 84 C 235 Fair 25 90
И мы можемубедитесь, что случайные значения назначены, хотя все они соответствуют одному из двух условий.Хотя это менее эффективно для использования памяти, чем итерация и выбор случайного значения, поскольку мы создаем много неиспользуемых чисел, оно все равно будет быстрее, поскольку это векторизованные операции.