Не уверен в методе pandas
, но numpy.searchsorted
идеально подходит здесь.
Находит индексы, в которые следует вставлять элементы для поддержания порядка.
Когда у вас есть индексы, в которые будут вставлены ваши элементы для поддержания сортировки, вы можете посмотреть на элемент слева этих индексов в массиве поиска, чтобы найти ближайшийменьший элемент.Если элемент будет вставлен в начало списка (индекс 0), мы знаем, что меньший элемент не существует в списке поиска, и мы учитываем этот сценарий, используя np.where
A = np.array([-1, 2, 5, 7])
r = np.searchsorted(A, df.a.values)
df.assign(b=np.where(r == 0, np.nan, A[r-1])).fillna('X')
a b
0 0 -1
1 -2 X
2 4 2
3 1 -1
4 6 5
Этот метод будет намного быстрее, чем apply
здесь.
df = pd.concat([df]*10_000)
%%timeit
r = np.searchsorted(A, df.a.values)
df.assign(b=np.where(r == 0, np.nan, A[r-1])).fillna('X')
6.09 ms ± 367 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df['a'].apply(largest_min)
196 ms ± 5.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)