python - 使用大列表对多索引 pandas 数据框进行切片

标签 python pandas dataframe slice

我有一个带有多索引的大型数据框。我想使用一个相当大的列表来分割这个数据框。下面是示例代码。此操作花费了近 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')

是否有更快的内存切片方法?

最佳答案

如果您的目的是按任意列表对多索引进行切片,那么使用查询会快得多

创建从 500010000 的任意列表

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

关于python - 使用大列表对多索引 pandas 数据框进行切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60571120/

相关文章:

python - 如何计算批处理数据帧的平均值?

python - 使用 pandas 数据框中最近创建的属性来创建新属性

python - axis = 0 似乎在 sum() 和 dropna() 中表现不同

jquery - 如何将 JQGrid 与 Django/Python 集成

python - 如何有效地将运算符应用于两个数组的笛卡尔积?

python - Matplotlib 为所有图勾选无衬线字体

python - 添加数据框中行批处理的总和

python - 优化基于另一个字段从一个字段中提取子字符串的循环

python - 如何在索引中应用 value_counts 并创建新的数据帧?

python - 基于 Pandas 中的多个键合并两个DataFrame