当前位置: 首页 > 知识库问答 >
问题:

将通过Pandas/PyTables写入的大型hdf5数据集转换为vaex

舒仲渊
2023-03-14

我有一个非常大的数据集,我通过append以块形式写入hdf5,如下所示:

with pd.HDFStore(self.train_store_path) as train_store:
    for filepath in tqdm(filepaths):
        with open(filepath, 'rb') as file:
            frame = pickle.load(file)

        if frame.empty:
            os.remove(filepath)
            continue

        try:
            train_store.append(
                key='dataset', value=frame,
                min_itemsize=itemsize_dict)
            os.remove(filepath)
        except KeyError as e:
            print(e)
        except ValueError as e:
            print(frame)
            print(e)
        except Exception as e:
            print(e) 

数据太大,无法加载到一个DataFrame中,因此我想尝试使用vaex进行进一步处理。不过有几件事我不太明白。

由于vaex在hdf5中使用了不同于pandas/pytables(VOTable)的表示形式,我想知道如何在这两种格式之间进行转换。我尝试将数据块加载到pandas中,将其转换为vaex数据帧,然后将其存储,但似乎没有办法将数据附加到现有的vaex hdf5文件中,至少我找不到。

真的没有办法从VAEX内部创建一个大的hdf5数据集吗?将现有数据集转换为VAEX的表示形式(通过python脚本或TOPCAT构造文件)是唯一的选择吗?

与我前面的问题相关,如果我在vaex中使用一个大的数据集,那么是否可以将我在vaex中应用的任何转换的结果持久化到hdf5文件中?

共有1个答案

爱亮
2023-03-14

这种存储格式的问题是它不是基于列的,这不能很好地处理具有大量行的数据集,因为例如,如果只处理1列,OS可能也会读取其他列的大部分,并且CPU缓存也会因此受到污染。最好将它们存储为基于列的格式,如VAEX'hdf5格式或箭头格式。

转换到vaex数据帧可以使用以下方法完成:

import vaex
vaex_df = vaex.from_pandas(pandas_df, copy_index=False)

您可以对每个数据帧执行此操作,并将它们存储在磁盘上,如hdf5或箭头所示:

vaex_df.export('batch_1.hdf5')  # or 'batch_1.arrow'
df1 = vaex.open('batch_1.hdf5')
df2 = vaex.open('batch_2.hdf5')
df = vaex.concat([df1, df2]) # will be seen as 1 dataframe without mem copy
df_altnerative = vaex.open('batch*.hdf5')  # same effect, but only needs 1 line

如果您对dataframe进行转换,您可以写出计算值,或者获得包含以下转换的“状态”:

import vaex
df = vaex.example()
df['difference'] = df.x - df.y
# df.export('materialized.hdf5', column_names=['difference'])  # do this if IO is fast, and memory abundant
# state = df.state_get()  # get state in memory
df.state_write('mystate.json') # or write as json


import vaex
df = vaex.example()
# df.join(vaex.open('materialized.hdf5'))  # join on rows number (super fast, 0 memory use!)
# df.state_set(state)  # or apply the state from memory
df.state_load('mystate.json')  # or from disk
df
 类似资料:
  • 问题内容: 我有一个100M的CSV文件(实际上是许多单独的CSV文件),总计84GB。我需要将其转换为具有单个float数据集的HDF5文件。我在测试中使用 h5py 时没有任何问题,但是现在我无法在没有内存不足的情况下完成最终数据集。 如何在不必将整个数据集存储在内存中的情况下写入HDF5?我期望这里有实际的代码,因为它应该很简单。 我只是在研究 pytables ,但看起来数组类(与HDF5

  • 问题内容: 我有一个带有列名称的数据集“城市” 我使用以下代码,并将列名命名为 在pandas._period.Period数据类型中。 我希望列为 我希望在输出列名称中使用小写字母“ q”。 谢谢。 问题答案: 您需要使用什么: 样品:

  • 问题内容: 我试图将输出转换为熊猫数据框,但我很努力。我有这个清单 我想创建一个具有3列和3行的熊猫数据框。我尝试使用 但它似乎对我不起作用。任何帮助,将不胜感激。 问题答案: 您需要转换为然后:

  • 我想从InstaCart https://www.InstaCart.com/datasets/grocery-shopping-2017加载大型.csv(3.4百万行,20.6万用户)开源数据集 基本上,我在将orders.csv加载到Pandas数据帧中时遇到了麻烦。我想学习将大文件加载到Pandas/Python中的最佳实践。

  • 问题内容: 我的问题与此非常相似,但是我需要转换整个数据框,而不仅仅是转换一系列数据框。该功能一次只能在一个系列上使用,不能很好地替代不推荐使用的命令。有没有办法获得与新熊猫版本中的命令相似的结果? 谢谢MikeMüller的示例。如果所有值都可以转换为整数,则效果很好。如果在我的数据帧中我有无法转换为整数的字符串怎么办?例: 然后,我可以运行不赞成使用的函数并获取: 运行命令会给我错误,即使尝试

  • 问题内容: 我需要将列表转换为一列熊猫数据框 当前列表(len = 3): 所需的熊猫DF(形状= 3,): 请注意,这些数字代表上述“必需熊猫” DF中的索引。 问题答案: 采用: 谢谢DYZ: