Найти первую строку, где значение меньше порогового значения

У меня есть фрейм данных pandas, где я пытаюсь найти первое ID, когда left меньше значений

list = [0,50,100,150,200,250,500,1000]
             ID  ST  ...          csum           left
0             0  AK  ...  4.293174e+05  760964.996900
1             1  AK  ...  4.722491e+06  760535.679500
2             2  AK  ...  8.586347e+06  760149.293900
3             3  AK  ...  2.683233e+07  758324.695200
4             4  AK  ...  2.962290e+07  758045.638900
..          ... ...  ...           ...            ...
111         111  AK  ...  7.609006e+09     107.329336
112         112  AK  ...  7.609221e+09      85.863469
113         113  AK  ...  7.609435e+09      64.397602
114         114  AK  ...  7.609650e+09      42.931735
115         115  AK  ...  7.610079e+09       0.000000

Итак, я бы получил список или фреймворк данных, похожий на

threshold      ID
        0      115
       50      114
      100      112
      150      100
      200      100
      250       99
      500       78
     1000       77

Как я могу этого добиться?

взгляните на merge_asof

Quang Hoang 11.02.2023 23:57

Что вы подразумеваете под «просто превосходит»? С точки зрения «левого» значения или позиции?

mozway 12.02.2023 00:03

@mozway извини. Я имею в виду, что хочу извлечь первое ID значение, превышающее значения списка. Например. для left, то есть 107,32, я хочу получить ID для предыдущей строки.

Thomas 12.02.2023 00:06

@QuangHoang Мне нужно включить термин left < list[values], что невозможно с merge_asof.

Thomas 12.02.2023 00:10

Я думаю, что да, поиграйте с параметром direction.

Quang Hoang 12.02.2023 00:10

Почему нет? Хотя в вашем примере вы не следовали строгому <, 0 не должен соответствовать чему-либо.

mozway 12.02.2023 00:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите сопоставить идентификатор первого значения больше целевого, используйте merge_asof:

lst = [0,50,100,150,200,250,500,1000]

pd.merge_asof(pd.Series(lst, name='threshold', dtype=df['left'].dtype),
              df.sort_values(by='left').rename(columns = {'left': 'threshold'})[['threshold', 'ID']],
              # uncomment for strictly superior
              #allow_exact_matches=False,
)

Выход:

   threshold   ID
0        0.0  115
1       50.0  114
2      100.0  112
3      150.0  111 # due to truncated input
4      200.0  111 #
5      250.0  111 #
6      500.0  111 #
7     1000.0  111 #
list = [0,50,100,150,200,250,500,1000]
df11=pd.DataFrame(dict(threshold=list))
df11.assign(id=df11.threshold.map(lambda x:df1.query("left<=@x").iloc[0,0]))
  

вне

   threshold   ID
0        0.0  115
1       50.0  114
2      100.0  112
3      150.0  111 # due to truncated input
4      200.0  111 #
5      250.0  111 #
6      500.0  111 #
7     1000.0  111 #

Другие вопросы по теме