小编典典

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

python

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

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

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

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

运行python 2.7和pandas 0.16.0

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


阅读 250

收藏
2021-01-20

共1个答案

小编典典

为了提高性能,可以使用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)')

图形

2021-01-20