Существует ли векторизованный способ получения ближайшего (меньшего или равного) значения из списка уникальных значений для каждой строки?

#python #pandas

#python #pandas

Вопрос:

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

 >>> df = pd.DataFrame({"A": [2010, 1963, 2014, 1998, 2004, 2010]})
>>> df
      A
0  2010
1  1963
2  2014
3  1998
4  2004
5  2010
  

и список уникальных лет:

 >>> years = [1964, 1973, 1985, 1993, 2003, 2004, 2011]
  

Для каждого элемента в столбце A я хочу получить ближайшее значение years . Однако это значение должно быть меньше или равно соответствующему элементу в столбце A .

Я мог бы использовать min() с lambda помощью и использовать apply() , чтобы получить год для каждой строки. Мне интересно, есть ли какой-либо векторизованный способ сделать это?

Я хочу получить такой фрейм данных:

 >>> df["B"] = some_func(df["B"], years)
>>> df
      A     B
0  2010  2004
1  1963   NaN  # There is not a smaller or equal value than 1963 in years
2  2014  2011
3  1998  1993
4  2004  2004
5  2010  2004
  

Ответ №1:

У нас есть merge_asof

 out = pd.merge_asof(df.sort_values('A'),pd.DataFrame({'A':years,'B':years}), on ='A')
Out[133]: 
      A       B
0  1963     NaN
1  1998  1993.0
2  2004  2004.0
3  2010  2004.0
4  2010  2004.0
5  2014  2011.0