pandas 数据框:loc 与查询性能

Posted

技术标签:

【中文标题】pandas 数据框:loc 与查询性能【英文标题】:pandas dataframe: loc vs query performance 【发布时间】:2018-09-30 20:54:09 【问题描述】:

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

DF1:4M 记录 x 3 列。查询功能接缝更多 比 loc 函数更高效。

DF2:2K 记录 x 6 列。 loc 函数接缝更多 比查询功能更高效。

两个查询都返回一条记录。模拟是通过在循环中运行相同的操作 10K 次来完成的。

运行 python 2.7 和 pandas 0.16.0

有什么提高查询速度的建议吗?

【问题讨论】:

能否添加一些样本数据进行测试?但是这个graph解释query在大数据中应该更快。 我认为 query 总是会因为字符串评估而带来一些开销 向我们展示查询表达式,它有多复杂和昂贵?您是否正在寻求有关如何重构它以提高速度的建议? 【参考方案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)')

编辑:

带有修改的ne 和改进的be 的图表:

def ne(x):
    return x[numexpr.evaluate('(x > 5)')]

def bex(x):
    return x[x.A.values > 5]

【讨论】:

不错的答案。我觉得第二部分的“q”函数应该是return x.query('A > 5') 进行更改会导致“q”和“ev”行几乎相同,这是有道理的,因为查询只是 eval 函数的包装 第二部分(图形代码)中的ne 函数与其他函数返回的内容不同。每个其他函数都返回一个Pandas DataFrame,而ne 返回一个numpy.Array。当重写以匹配第一部分中的ne 函数时,它的性能更接近be 您还可以通过编写return return x[x.A.values > 5] 来从be 中挤出更多性能 我按照上面@VictorUriarte 的评论,用更正的ne 和修改的be 函数重新运行了测试,并编辑了答案以显示扩展图。

以上是关于pandas 数据框:loc 与查询性能的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 数据框通过 .loc 一次创建多行

Python pandas 数据框警告,建议改用 .loc 吗?

使用 loc 更新数据框 python pandas

Pandas总结第五节 Pandas 数据查询方法总结_df.loc()总结

数据框 pandas 中的几个 � 字符

python--pandas切片