Найти индекс элемента в серии панд


Я знаю, что это очень простой вопрос, но по какой-то причине я не могу найти ответ. Как я могу получить индекс определенного элемента серии в 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 74

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 

часто ваше значение встречается при нескольких индексах:

>>> myseries = pd.Series([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1])
>>> myseries.index[myseries == 1]
Int64Index([3, 4, 5, 6, 10, 11], dtype='int64')