Используя iloc
с np.where
:
idx = next(iter(df['number'].iloc[np.where(df['color'].eq('blue'))]), -1) # 4
Обратите внимание, что это также обрабатывает случай, когда цвет не существует. Для сравнения, df['color'].eq('orange').idxmax()
дает 0
, хотя 'orange'
не существует в серии. Вышеуказанная логика даст -1
.
numba
Мне интересно, есть ли более оптимальный подход, учитывая, что я только
когда-нибудь нужно первое вхождение.
Да! Для более эффективного решения см. Эффективно вернуть индекс первого значения, удовлетворяющего условию в массиве . Numba позволяет эффективно выполнять итерацию по строкам. В этом случае вам нужно будет сначала разложить ваши строки , чтобы вы передавали числовые массивы только в Numba:
from numba import njit
# factorize series, pd.factorize maintains order,
# i.e. first item in values gives 0 index
idx, values = pd.factorize(df['color'])
idx_search = np.where(values == 'blue')[0][0]
@njit
def get_first_index_nb(A, k):
for i in range(len(A)):
if A[i] == k:
return i
return -1
res = df['number'].iat[get_first_index_nb(idx, 1)] # 4
Конечно, для одноразового расчета это неэффективно. Но для последовательных вычислений решение, скорее всего, будет фактором быстрее, чем решения, которые проверяют равенство по всей серии / массиву.