我有一个带有多索引的大型数据框。我想使用相当大的列表来切片此数据框。下面是一个示例代码。此操作大约需要10秒钟。
import pandas as pd
import numpy as np
df = pd.DataFrame(
{
"x": np.repeat(np.arange(10000), 50),
"y": np.repeat(np.arange(50), 10000),
"val": np.random.rand(50*10000)
}
).set_index(["x", "y"])
large_list = range(5000,10000)
slice = df.loc[(large_list, slice(None)),:] # Takes 10 seconds on my machine
作为比较,如果我将此数据帧写入hdf文件并以与切片操作相同的where
条件进行读取,则只需1.5秒!
df.to_hdf("sample.hdf", key="df", append=True)
df1 = pd.read_hdf("sample.hdf", "df", where='x in large_list')
是否有更快的切片内存的方法?
答案 0 :(得分:2)
如果您打算按任意列表对多索引进行切片,则使用query
会更快
创建从5000
到10000
的任意列表
np.random.seed(0)
large_list = np.random.choice(list(range(5000, 10000)), 5000, replace=False)
In [2245]: large_list
Out[2245]: array([5398, 8833, 9836, ..., 6653, 7607, 7732])
x = df.query('x in @large_list')
比较结果
In [2246]: y = df.loc[(large_list, slice(None)),:]
In [2249]: np.allclose(x, y)
Out[2249]: True