代码之家  ›  专栏  ›  技术社区  ›  blue-sky

已筛选值的访问索引

  •  2
  • blue-sky  · 技术社区  · 7 年前

    在这里,我根据谓词访问序列的值:

    import numpy as np
    
    s = pd.Series(np.array([1,2,3]))
    print(type(s))
    
    print([i for i in s if i > 2])
    

    返回:

    <class 'pandas.core.series.Series'>
    [3]
    

    2 .

    1 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    7 年前

    使用 boolean indexing 具有 index :

    print (s.index[s > 2])
    #alternative
    #print (s[s > 2].index)
    Int64Index([2], dtype='int64')
    

    您的解决方案应更改为 Series.items :

    print([k for k, v in s.items() if v > 2])
    [2]
    

    表演 在较大的数据中是不同的:

    np.random.seed(45)
    s = pd.Series(np.random.randint(5, size=100000))
    
    #print (s)
    
    In [93]: %timeit ([k for k, v in s.items() if v > 2])
    13.3 ms ± 768 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [94]: %timeit (s.index[s > 2])
    930 µs ± 12.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [95]: %timeit (s[s > 2].index)
    1.74 ms ± 26.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [96]: %timeit (s.index[s.values > 2])
    742 µs ± 79.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [97]: %timeit (s.index.values[s.values > 2])
    647 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [98]: %timeit (s[s.values > 2].index.values)
    1.51 ms ± 12.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)