首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用大列表对多索引pandas数据帧进行切片

使用大列表对多索引pandas数据帧进行切片
EN

Stack Overflow用户
提问于 2020-03-07 04:24:31
回答 1查看 44关注 0票数 2

我有一个具有多索引的大型数据框架。我想使用一个相当大的列表来分割这个数据帧。下面是一个示例代码。此操作几乎需要10秒。

代码语言:javascript
复制
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秒!

代码语言:javascript
复制
df.to_hdf("sample.hdf", key="df", append=True)
df1 = pd.read_hdf("sample.hdf", "df", where='x in large_list')

有没有更快的方法来切分内存?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-07 05:19:43

如果您打算按任意列表对多索引进行分片,则使用query会快得多

创建从500010000的任意列表

代码语言:javascript
复制
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')

比较结果

代码语言:javascript
复制
In [2246]: y = df.loc[(large_list, slice(None)),:]
In [2249]: np.allclose(x, y)
Out[2249]: True
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60571120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档