pandas数据框:位置与查询性能

发布于 2021-01-29 15:07:55

我在python中有2个数据框,我想查询数据。

  • DF1:4M记录x 3列。查询函数比loc函数更有效。

  • DF2:2K记录x 6列。loc函数的接缝比查询函数更有效。

这两个查询都返回一条记录。通过将相同的操作循环运行10K次来完成仿真。

运行python 2.7和pandas 0.16.0

有什么建议可以提高查询速度?

关注者
0
被浏览
123
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为了提高性能,可以使用numexpr

    import numexpr
    
    np.random.seed(125)
    N = 40000000
    df = pd.DataFrame({'A':np.random.randint(10, size=N)})
    
    def ne(df):
        x = df.A.values
        return df[numexpr.evaluate('(x > 5)')]
    print (ne(df))
    
    In [138]: %timeit (ne(df))
    1 loop, best of 3: 494 ms per loop
    
    In [139]: %timeit df[df.A > 5]
    1 loop, best of 3: 536 ms per loop
    
    In [140]: %timeit df.query('A > 5')
    1 loop, best of 3: 781 ms per loop
    
    In [141]: %timeit df[df.eval('A > 5')]
    1 loop, best of 3: 770 ms per loop
    

    import numexpr
    np.random.seed(125)
    
    def ne(x):
        x = x.A.values
        return x[numexpr.evaluate('(x > 5)')]
    
    def be(x):
        return x[x.A > 5]
    
    def q(x):
        return x.query('A > 5')
    
    def ev(x):
        return x[x.eval('A > 5')]
    
    
    def make_df(n):
        df = pd.DataFrame(np.random.randint(10, size=n), columns=['A'])
        return df
    
    
    perfplot.show(
        setup=make_df,
        kernels=[ne, be, q, ev],
        n_range=[2**k for k in range(2, 25)],
        logx=True,
        logy=True,
        equality_check=False,  
        xlabel='len(df)')
    

    图形



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看