在pandas系列中查找元素的索引

我知道这是一个非常基本的问题,但由于某种原因我找不到答案。 我怎样才能得到一个系列在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) 

但我认为应该有更好的办法。 在那儿?

 >>> myseries[myseries == 7] 3 7 dtype: int64 >>> myseries[myseries == 7].index[0] 3 

虽然我承认应该有一个更好的方法来做到这一点,但是这至less可以避免迭代循环遍历对象并将其移动到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 

正如Viktor所指出的那样,创build索引需要一次性创build开销(当您实际上对索引做了某些操作时(例如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).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'] 

另一种做法是,虽然同样不令人满意,

 s = pd.Series([1,3,0,7,5],index=[0,1,2,3,4]) list(s).index(7) 

返回:3

按时使用当前数据集进行testing,我正在使用(随机考虑):

 [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,你可以得到你的值被发现的indecies数组:

 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) 

这将返回一个元素元组,其中包含indecies的数组,其中7是myseries中的值:

 (array([3], dtype=int64),) 

你可以使用Series.idxmax()

 >>> import pandas as pd >>> myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4]) >>> myseries.idxmax() 3 >>>