У меня есть такой фрейм данных:
orderID Amount
0 340.00
1 200.00
2 10.00
3 500.00
4 700.00
Я хочу «забить» каждую сумму заказа при условии, если сумма находится в назначенном диапазоне или если она «вне» того, как далеко от диапазона.
Мой диапазон: low = 300
, high = 500
, если в этом диапазоне я хочу присвоить счет = 100. Если значение в столбце Amount
находится за пределами диапазона, я хочу применить такую функцию оценки, какэто:
if Amount > high:
df['score'] = 100 - (Amount - high)/100
else:
df['score'] = 100 - (low - Amount)/100
Я попробовал такой фрагмент, но это занимает очень много времени (миллионы строк):
def pricing_function (df, column_name):
for l in range(0,df.shape[0]):
if (df[column_name].iloc[l] <= high and df[column_name].iloc[l] >= low):
df['score'][l] = 100
elif df[column_name].iloc[l] > high:
df['score'][l] = 100 - (low - Amount)/100
else:
df['score'][l] = 100 - (low - Amount)/100
И затем примените функцию как:
df['score'] = df.apply(pricing_function(df= my_df, column_name = 'Amount'))
В результате я хотел бы иметь такой фрейм данных:
orderID Amount score
0 340.00 100
1 200.00 99
2 10.00 71
3 500.00 100
4 700.00 80
Итерации по каждой ячейке с использованием цикла for занимает много времени, и я не могу найти решение для этогона StackOverflow.Я попытался использовать:
df['score'] = my_df['Amount'].between(low, high, inclusive = True)
Это дает значения True / False для значений внутри / вне диапазона.Позже я могу изменить логические значения на 1/0 и 100/0 на последнем шаге, но у меня все еще есть проблема с эффективным применением моей функции scoring_function.