Pandas在大环境下阅读

2024-05-29 05:10:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pandas库读取一个64gb的HDF文件(用blosc压缩)。数据帧包含3列和11410996915行。我试图用这个方法按索引选择具体的行熊猫。阅读争论在哪里。问题是,有时我需要获取数千行,因此在where参数中我输入了如下内容:

simMat = pd.read_hdf('global.h5','matrix', columns=['similarity'], where='index in {}'.format(listIdx))

其中listIdx是一个整数列表,表示我要返回的索引。当这个列表包含超过31个元素时,我得到一个内存错误。我开始查看pandas库的代码,并在文件中发现了这一点pytables.py,在BinOp类中,有一个名为_max_selectors的变量,它将值指定为31。此变量在这段代码的后面使用:

^{pr2}$

使用过滤器会导致库尝试加载整个数据帧,这会产生MemoryError。我还试图使用值为10的chunksize参数,但它也不起作用。你知道用这么大的索引集查询HDF文件的更好方法吗?在


Tags: 文件数据方法代码内容pandas列表参数
1条回答
网友
1楼 · 发布于 2024-05-29 05:10:25

您可以使用以下技术:

pd.read_hdf(filename, 'key', where='index = vals')

其中valspd.SeriesPython list变量

也可以使用属于其他DF的列进行筛选:

^{pr2}$

或其他DF的索引:

In [203]: pd.read_hdf(fn, 'test', where='index = another_df.index').shape
Out[203]: (100, 3)

演示:

设置

fn = r'D:\temp\.data\hdf\test.h5'

store = pd.HDFStore(fn)

df = pd.DataFrame(np.random.randint(0, 10**4, size=(10**5, 3)), columns=list('abc'))

store.append('test', df, data_columns=True, complib='blosc', complevel=5)

store.close()

试验

vals = pd.Series(np.random.randint(0, 100, 500))

In [196]: pd.read_hdf(fn, 'test', where='index = vals').shape
Out[196]: (98, 3)

与Python列表相同:

idx_list = vals.tolist()

In [197]: pd.read_hdf(fn, 'test', where='index = idx_list').shape
Out[197]: (98, 3)

相关问题 更多 >

    热门问题