Как проверить, находится ли значение в ячейке в диапазоне. Исходя из этого присваивают различные «баллы» для нового столбца - PullRequest
0 голосов
/ 24 июня 2018

У меня есть такой фрейм данных:

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.

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

С numpy.where функция:

df['score'] = np.where(df.Amount.between(low, high), 100,
                       np.where(df.Amount > high, 100 - (df.Amount - high)/100,
                                                  100 - (low - df.Amount)/100))

Интерактивное:

In [46]: df['score'] = np.where(df.Amount.between(low, high), 100, np.where(df.Amount > high, 100 - (df.Amount - high)/100, 100 - (low - df.Amount)/100))

In [47]: df
Out[47]: 
   orderID  Amount  score
0        0   340.0  100.0
1        1   200.0   99.0
2        2    10.0   97.1
3        3   500.0  100.0
4        4   700.0   98.0
0 голосов
/ 24 июня 2018

Вы можете использовать один numpy.where:

low, high = 300, 500

df['score'] = np.where(df['Amount'].between(low, high), 100,
                       100 - np.maximum(low - df['Amount'], df['Amount'] - high)/100)

print(df)

   orderID  Amount  score
0        0   340.0  100.0
1        1   200.0   99.0
2        2    10.0   97.1
3        3   500.0  100.0
4        4   700.0   98.0

Логика следующая:

  1. Если в пределах диапазона выберите 100.
  2. Если выше диапазона, df['Amount'] - high > 0 > low - df['Amount'];и наоборот.Мы берем максимум, чтобы убедиться, что используется только положительное значение.
0 голосов
/ 24 июня 2018

Я думаю, что нужно numpy.select что использовать для избежания множественных np.where:

low = 300
high = 500
m1 =  df.Amount > high
#inclusive = True is by default, so omited
m2 = df['Amount'].between(low, high)

a = 100 - (df.Amount - high)/100
b = 100 - (low - df.Amount)/100

df['score'] = np.select([m2, m1], [100,a], default=b)
print (df)
   orderID  Amount  score
0        0     340  100.0
1        1     200   99.0
2        2      10   97.1
3        3     500  100.0
4        4     700   98.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...