我有一个大的Pandas DataFrame(~800M行),我在其中使用两个索引,一个整数和一个日期,对MultiIndex进行了索引。我想根据我拥有的整数列表(约10k)检索DataFrame的子集。整数匹配多重索引的第一个索引。MultiIndex是唯一的。
我尝试的第一件事是按索引对其进行排序,然后使用loc
查询:
df = get_my_df() # 800M rows
ids = [...] # 10k ints, sorted list
df.set_index(["int_idx", "date_idx"], inplace=True, drop=False)
df.sort_index(inplace=True)
idx = pd.IndexSlice
res = df.loc[idx[ids, :]]
然而这个过程非常缓慢,大约一个小时后我停止了代码的运行。
接下来我尝试的是仅将第一个设置为索引。对我来说,这是次优的,因为索引不是唯一的,而且稍后我还需要按日期进一步筛选:
df.set_index("int_idx", inplace=True, drop=False)
df.sort_index(inplace=True)
idx = pd.IndexSlice
res = df.loc[idx[ids, :]]
令我惊讶的是这有所改善,但仍然非常缓慢。
我的两个问题:
- 我该如何使查询更快?(无论是使用单索引还是多索引)
- 为什么排序的多索引仍然很慢?