我在python中有2个数据框,我想查询数据。
DF1:4M记录x 3列。查询函数比loc函数更有效。
DF2:2K记录x 6列。loc函数的接缝比查询函数更有效。
这两个查询都返回一条记录。通过将相同的操作循环运行10K次来完成仿真。
运行python 2.7和pandas 0.16.0
有什么建议可以提高查询速度?
为了提高性能,可以使用numexpr:
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)')