Python 正在寻找在大熊猫数据帧中切片一行的最快方法

Python 正在寻找在大熊猫数据帧中切片一行的最快方法,python,pandas,Python,Pandas,我的程序需要根据数据帧中列中的值获取行。响应时间至关重要。我使用最常用的方法,例如: df.loc[df['id']==500000,:] 在我的Mac电脑上,按照timeit,在一个有一百万行的数据帧上完成上述操作需要4毫秒。但是我的目标是减少0.4毫秒的时间。我曾经考虑把这个数据文件转换成一个集合,但是SET不是有序的,也不支持索引或切片。有什么建议吗?检查df.query('id==500000')的运行速度。让我们设置: import pandas as pd import numpy

我的程序需要根据数据帧中列中的值获取行。响应时间至关重要。我使用最常用的方法,例如:

df.loc[df['id']==500000,:]
在我的Mac电脑上,按照
timeit
,在一个有一百万行的数据帧上完成上述操作需要4毫秒。但是我的目标是减少0.4毫秒的时间。我曾经考虑把这个数据文件转换成一个集合,但是SET不是有序的,也不支持索引或切片。有什么建议吗?

检查df.query('id==500000')的运行速度。

让我们设置:

import pandas as pd
import numpy as np
df = pd.DataFrame({"id": np.random.randint(100,size=(1000000,))})
然后让我们对一些选项进行基准测试。您当前的布尔值+
.loc

>>> timeit.timeit("df.loc[df['id'] == 50, :]", setup = "from __main__ import df", number=1000)
2.566220869999597
查询引擎:

>>> timeit.timeit("df.query('id == 50')", setup = "from __main__ import df", number=1000)
14.591400260000228
将索引用作单独的查找:

>>> idx = pd.Index(df['id'])
>>> timeit.timeit("df.loc[idx == 50, :]", setup = "from __main__ import df, idx", number=1000)
2.2155187300013495
使用数据帧索引进行查找:

>>> df.index = df["id"]
>>> timeit.timeit("df.loc[50, :]", setup = "from __main__ import df", number=1000)
2.625610274999417
还有
.isin()
评论中有人的想法:

>>> timeit.timeit("df.loc[df['id'].isin([50]), :]", setup = "from __main__ import df", number=1000)
9.542700138999862
看起来除了查询引擎速度慢(正如预期的那样)外,对于一个简单的等式,您不会得到比您已经得到的查找时间更好的结果

df_unique = pd.DataFrame({'id': range(1000000)})
让我们看看一个唯一的ID有什么帮助:

>>> timeit.timeit("df_unique.loc[df_unique['id'] == 50, :]", setup = "from __main__ import df_unique", number=1000)
1.9672015519990964
然后是一句格言:

>>> df_unique.index = df_unique['id']
>>> df_dict = df_unique.to_dict(orient='index')
>>> timeit.timeit("df_dict[50]", setup = "from __main__ import df_dict", number=1000)
6.247700002859347e-05
看来这是个明显的赢家

>>> timeit.timeit("pd.Series(df_dict[50])", setup = "from __main__ import df_dict, pd", number=1000)
0.2747819870000967

即使你不得不把它放回到一个系列中,这比以前快了一个数量级。(如果需要,您还可以非常轻松地将一系列映射回dict,并保持dict查找的速度,而无需任何开销)

我只是在这里拍摄,不知道这些是否更快,但请尝试:
df.query('id==500000')
&
df[df['id'].isin(500000)]
考虑制作
id
您的索引。索引查找非常快,它将避免您现在执行的线性时间查找。幸运的是,我的数据帧中的ID是唯一的,因此我可以通过将其转换为字典来使用您的上一个解决方案。我会在我的情况下试试。