#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