#python #pandas #percentile #argmax
#python #pandas #процентиль #argmax
Вопрос:
Нужна помощь в присвоении ранга / переменной на основе входного значения и где это соответствует значениям столбцов в процентилях Пример:
If input value = Min column value --> Rank 1
input value between Min column value and P25 column value --> Rank 2
input value between P75 column value and Max column value --> Rank 5
input value = Max column value --> Rank 6
Вот пример данных:
date | value | Min | P25 | P50 | P75 | Max | output
---------------------------------------------------
1-Sep| 45 | 12.0 | 28.2 | 48.9 | 85.4 | 98.0 | 3
2-Sep| 63 | 12.0 | 28.2 | 48.9 | 85.4 | 98.0 | 4
3-Sep| 87 | 12.0 | 28.2 | 48.9 | 85.4 | 98.0 | 5
4-Sep| 12 | 12.0 | 28.1 | 48.9 | 85.2 | 98.0 | 1
5-Sep| 89 | 14.2 | 28.8 | 48.9 | 85.8 | 98.0 | 5
6-Sep| 98 | 14.2 | 28.8 | 48.9 | 85.8 | 98.0 | 6
7-Sep| 41 | 14.2 | 28.8 | 48.9 | 85.6 | 97.9 | 3
8-Sep| 22 | 14.2 | 28.8 | 48.9 | 85.6 | 97.9 | 2
Словарь ранжирования (конфигурация) выглядит следующим образом: [Min:1, P25:2, P50:3, p75:4, Max:5, Max:6]
(Это можно изменить, если есть лучший способ представления)
Я пытался использовать значения сортировки (при использовании функции apply), но не смог определить минимальные / максимальные условия. Этот pandas df имеет более 100 тыс. строк.
Заранее спасибо.
Ответ №1:
Вы можете использовать np.select
для этого:
cond1 = df['value'] <= df['Min']
cond2 = df['value'] <= df['P25']
cond3 = df['value'] <= df['P50']
cond4 = df['value'] <= df['P75']
cond5 = df['value'] < df['Max']
df['rank'] = np.select([cond1, cond2, cond3, cond4, cond5], [1,2,3,4,5], 6)
df
Вывод:
date value Min P25 P50 P75 Max output rank
1 1-Sep 45.0 12.0 28.2 48.9 85.4 98.0 3.0 3
2 2-Sep 63.0 12.0 28.2 48.9 85.4 98.0 4.0 4
3 3-Sep 87.0 12.0 28.2 48.9 85.4 98.0 5.0 5
4 4-Sep 12.0 12.0 28.1 48.9 85.2 98.0 1.0 1
5 5-Sep 89.0 14.2 28.8 48.9 85.8 98.0 5.0 5
6 6-Sep 98.0 14.2 28.8 48.9 85.8 98.0 6.0 6
7 7-Sep 41.0 14.2 28.8 48.9 85.6 97.9 3.0 3
8 8-Sep 22.0 14.2 28.8 48.9 85.6 97.9 2.0 2
Комментарии:
1. Спасибо Скотту Бостону. Отлично сработало. Я добавил условие и варианты в словарь, использовал pd.eval вместе с np.select
2. @Sharif Я хотел бы увидеть ваше решение, не могли бы вы опубликовать его. Я всегда чему-то учусь из Stack Overflow.
3. Вот фрагмент моего кода:
code levels = { "df['0.00'] == df[value]": 7, "(df['0.00'] < df[value]) amp; (df['0.68'] >= df[value])": 5, "(df['0.68'] < df[value]) amp; (df['0.99'] >= df[value])": 3, "df['1.00'] == df[value]": 1, } condlist = [] choicelist = [] for key, value in levels.items(): condlist.append(pd.eval(key)) choicelist.append(value) df[target_col] = np.select(condlist, choicelist)