我有一个非常大的pandas数据帧/系列,有数百万个元素.我需要找到时间戳<小于t0的所有元素.通常我会做的是:
selected_df = df[df.index < t0]
Run Code Online (Sandbox Code Playgroud)
这需要很长时间.据我所知,当pandas搜索时,它会遍历数据帧的每个元素.但是我知道我的数据帧已经排序,因此我可以在时间戳> t0后立即中断循环.我假设pandas不知道数据帧已排序并搜索所有时间戳.
我试过用pandas.Series代替 - 仍然很慢.我试着编写自己的循环,如:
boudery = 0
ticks_time_list = df.index
tsearch = ticks_time_list[0]
while tsearch < t0:
tsearch = ticks_time_list[boudery]
boudery += 1
selected_df = df[:boudery]
Run Code Online (Sandbox Code Playgroud)
这需要比熊猫搜索更长的时间.我能看到的唯一解决方案就是使用Cython.任何想法如何在没有C参与的情况下进行排序?
对我来说似乎并不需要很长时间,即使是长框架:
>>> df = pd.DataFrame({"A": 2, "B": 3}, index=pd.date_range("2001-01-01", freq="1 min", periods=10**7))
>>> len(df)
10000000
>>> %timeit df[df.index < "2001-09-01"]
100 loops, best of 3: 18.5 ms per loop
Run Code Online (Sandbox Code Playgroud)
但如果我们真的想要挤出每一滴性能,我们可以searchsorted在下降到numpy以下后使用该方法:
>>> %timeit df.iloc[:df.index.values.searchsorted(np.datetime64("2001-09-01"))]
10000 loops, best of 3: 51.9 µs per loop
>>> df[df.index < "2001-09-01"].equals(df.iloc[:df.index.values.searchsorted(np.datetime64("2001-09-01"))])
True
Run Code Online (Sandbox Code Playgroud)
这要快很多倍.