在pandas Series中找到元素的索引

2024-04-19 19:47:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这是一个很基本的问题,但不知为什么我找不到答案。如何获取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)

但我想应该有更好的办法。有?


Tags: 答案import元素pandasoutputindexreturnas
3条回答

转换为索引时,可以使用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

正如Viktor所指出的,创建索引有一个一次性的创建开销(当您实际对索引执行某些操作时,例如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
>>> myseries[myseries == 7]
3    7
dtype: int64
>>> myseries[myseries == 7].index[0]
3

尽管我承认应该有更好的方法来实现这一点,但这至少避免了对象的迭代和循环,并将其移动到C级别。

In [92]: (myseries==7).argmax()
Out[92]: 3

如果你事先知道有7个的话,这个就行了。你可以查一下 (myseries==7).any()

另一种方法(非常类似于第一个答案)也解释了多个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']

相关问题 更多 >