Я знаю, что это очень простой вопрос, но по какой-то причине я не могу найти ответ. Как я могу получить индекс определенного элемента Серии в пандах Python? (первого появления будет достаточно)
Т.е. я бы хотел что-то вроде:
import pandas as pd
myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4])
print myseries.find(7) # should output 3
Конечно, такой метод можно определить с помощью цикла:
def find(s, el):
for i in s.index:
if s[i] == el:
return i
return None
print find(myseries, 7)
но я предполагаю, что должен быть лучший способ. Здесь?
Преобразование в индекс, вы можете использовать
get_loc
Обработка дубликатов
Вернет логический массив, если несмежные возвраты
Использует хеш-таблицу внутри, так быстро
Как отмечает Виктор, при создании индекса возникают разовые накладные расходы (это происходит, когда вы действительно что-то делаете с индексом, например,
is_unique
)источник
s.index[_]
Это работает, если вы знаете, 7 заранее. Вы можете проверить это с помощью (myseries == 7) .any ()
Другой подход (очень похожий на первый ответ), который также учитывает множественные 7 (или ни одного)
источник
any
проверки не является идеальным, поскольку необходима двойная итерация. Есть классная проверка после операции, которая раскроет всеFalse
условия, которые вы можете увидеть здесь .argmax
все равно вернет 0 (вместо вывода из строя).Я впечатлен всеми ответами здесь. Это не новый ответ, просто попытка обобщить время всех этих методов. Я рассмотрел случай ряда с 25 элементами и предположил общий случай, когда индекс может содержать любые значения, и вы хотите, чтобы значение индекса соответствовало значению поиска, которое находится ближе к концу ряда.
Вот тесты скорости на MacBook Pro 2013 года в Python 3.7 с версией 0.25.3 для Pandas.
@ Ответ Джеффа кажется самым быстрым - хотя он не обрабатывает дубликаты.
Исправление : Извините, я пропустил одно, решение @Alex Spangher, использующее метод индекса списка, является самым быстрым.
Обновление : добавлен ответ @ EliadL.
Надеюсь это поможет.
Удивительно, что такая простая операция требует таких запутанных решений, а многие такие медленные. Более половины миллисекунды в некоторых случаях, чтобы найти значение в серии 25.
источник
myindex
, как он создан, поскольку его нужно создать только один раз?myindex
сериал стоит только в том случае, если вы собираетесь делать поиск много раз. Для этого теста я предположил, что это было необходимо только один раз, и было важно общее время выполнения.pd.Index(myseries)
. Чтобы быть справедливым по отношению к другим методам, я предположил, что оригинальная серия могла измениться с момента последнего поиска.Еще один способ сделать это, хотя и в равной степени неудовлетворительный:
возвращает: 3
На временных тестах с использованием текущего набора данных, с которым я работаю (считаю это случайным):
источник
Если вы используете numpy, вы можете получить массив значений, в которых найдено ваше значение:
Это возвращает кортеж из одного элемента, содержащий массив индексов, где 7 - это значение в myseries:
источник
Вы можете использовать Series.idxmax ()
источник
index of certain element
такой как заданный вопрос.Другой способ сделать это, который еще не был упомянут, - это метод tolist:
должен вернуть правильный индекс, предполагая, что значение существует в Серии.
источник
Часто ваша ценность встречается по нескольким показателям:
источник
Это самый родной и масштабируемый подход, который я мог найти:
источник