向大数据帧添加索引是否可以加快查找速度



我是pandas的新手,在代码中使用pandas数据帧。数据帧相当大(包含超过2M行(。我还没有向数据帧添加任何索引。每行中的一个值是与该行关联的日期,我所做的是按日期处理帧中的数据。我有一行代码可以执行以下操作:

these_trades = arc_trades[arc_trades['TradeDate'] == this_date]

所以,我只提取我需要的日期值。

我有一个相当强大的数据库背景,我的问题是"我应该向DataFrame arc_trades添加索引以使切片更快吗,另外,我可以有多个单独的索引用于不同的切片情况吗?如果是,我将如何添加索引?

在panda中使用索引确实有帮助。但从数据库背景来看,你可能高估了效果。在数据库中,添加索引可以将速度提高10倍甚至100倍。熊猫的情况并非如此。

如果你计时,使用指数会产生显著影响:

import pandas as pd
import numpy as np
from time import perf_counter
dates = pd.date_range('2020-01-01', '2020-12-31', freq='D')
idx = np.random.choice(dates, 2000000)
df = pd.Series(1, index=idx).to_frame()
start = perf_counter()
these_trades = df[df.index == datetime.datetime(2020, 1, 1)]
perf_index = perf_counter() - start
print(f'With index: {perf_index}')
df = df.reset_index()
start = perf_counter()
these_trades = df[df['index'] == datetime.datetime(2020, 1, 1)]
perf_no_index = perf_counter() - start
print(f'Without index: {perf_no_index}')
df['index'] = df['index'].dt.strftime('%Y-%m-%d')
start = perf_counter()
these_trades = df[df['index'] == '2020-01-01']
perf_as_string = perf_counter() - start
print(f'As string: {perf_as_string}')

输出:

With index: 0.007269900001119822
Without index: 0.01451519998954609
As string: 0.09630390000529587

因此,使用索引可能比使用普通列快30-50%。很好,但不太好。使用日期时间要快一个数量级。

你可以在日期列中使用set_index((,然后在这个"新"数据集中进行研究,所以它应该更快,但我认为你想要的这种优化应该用MySQL或类似的Data Managament语言或软件更正式地完成。

最新更新