Найти индекс элемента в серии панд
Я знаю, что это очень простой вопрос, но по какой-то причине я не могу найти ответ. Как я могу получить индекс определенного элемента серии в python pandas? (первое появление было бы достаточно)
то есть, я бы хотел что-то вроде:
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)
но я предполагаю, что там должен быть лучший способ. Есть ли?
8 ответов:
>>> myseries[myseries == 7] 3 7 dtype: int64 >>> myseries[myseries == 7].index[0] 3
хотя я признаю, что должен быть лучший способ сделать это, но это, по крайней мере, позволяет избежать итерации и цикличности через объект и перемещает его на уровень C.
преобразование в индекс, вы можете использовать
get_loc
In [1]: myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4]) In [3]: Index(myseries).get_loc(7) Out[3]: 3 In [4]: Index(myseries).get_loc(10) KeyError: 10
дублировать обращение
In [5]: Index([1,1,2,2,3,4]).get_loc(2) Out[5]: slice(2, 4, None)
вернет логический массив, если несмежные возвращает
In [6]: Index([1,1,2,1,3,2,4]).get_loc(2) Out[6]: array([False, False, True, False, False, True, False], dtype=bool)
использует хэш-таблицу внутри, так быстро
In [7]: s = Series(randint(0,10,10000)) In [9]: %timeit s[s == 5] 1000 loops, best of 3: 203 µs per loop In [12]: i = Index(s) In [13]: %timeit i.get_loc(5) 1000 loops, best of 3: 226 µs per loop
как указывает Виктор, есть одноразовые накладные расходы на создание индекса (его понесенные, когда вы действительно что-то делаете с индексом, например
is_unique
)In [2]: s = Series(randint(0,10,10000)) In [3]: %timeit Index(s) 100000 loops, best of 3: 9.6 µs per loop In [4]: %timeit Index(s).is_unique 10000 loops, best of 3: 140 µs per loop
In [92]: (myseries==7).argmax() Out[92]: 3
это работает, если вы знаете, что 7 есть заранее. Вы можете проверить это с (myseries==7).любой()
другой подход (очень похож на первый ответ), который также учитывает несколько 7-х (или ни одного) является
In [122]: myseries = pd.Series([1,7,0,7,5], index=['a','b','c','d','e']) In [123]: list(myseries[myseries==7].index) Out[123]: ['b', 'd']
другой способ сделать это, хотя и не менее неудовлетворительным является:
s = pd.Series([1,3,0,7,5],index=[0,1,2,3,4]) list(s).index(7)
возвращает: 3
тесты по времени с использованием текущего набора данных, с которым я работаю (считайте его случайным):
[64]: %timeit pd.Index(article_reference_df.asset_id).get_loc('100000003003614') 10000 loops, best of 3: 60.1 µs per loop In [66]: %timeit article_reference_df.asset_id[article_reference_df.asset_id == '100000003003614'].index[0] 1000 loops, best of 3: 255 µs per loop In [65]: %timeit list(article_reference_df.asset_id).index('100000003003614') 100000 loops, best of 3: 14.5 µs per loop
Если вы используете библиотеки numpy, вы можете получить массив индексы, что ваша ценность нашел:
import numpy as np import pandas as pd myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4]) np.where(myseries == 7)
Это возвращает кортеж, содержащий элемент массива индексы, где 7-значение в myseries:
(array([3], dtype=int64),)
вы можете использовать серии.idxmax ()
>>> import pandas as pd >>> myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4]) >>> myseries.idxmax() 3 >>>
ссылка Виктор Керкез (20 августа ' 13 в 5: 52) Джонатан Юнис (7 ноября '16 в 14:03)
>>> myseries[myseries == 7] 3 7 dtype: int64 >>> myseries[myseries == 7].index # using index[0] specifies the output of the first occurrence only. Using index without adding the element index will give you indexes all occurrences if the series had more then one 7 there. It still presumes you know which number you are looking for. 3