pandas.HDFStore:如何修改现有商店的 "data_columns"?我想为不在数据列中的列添加索引
pandas.HDFStore: How do I modify "data_columns" for an existing store? I'd like to add an index to a column not in data columns
我使用 pandas 创建了一个大型(120GB;10 亿行)HDF5 文件。在最初创建 hdf 文件后,我像这样添加到文件中:
with pd.get_store(path_output) as hdf_output:
for i in range(BIG_LOOP):
df = ...
hdf_output.append('all', df, data_columns=[])
我故意设置 data_columns=[] 以避免在创建时建立索引。现在我有了 HDF 文件,我想将索引添加到多个列(例如,columns_to_index=['A'、'B'、'C'])
不知何故,根据 ptdump,我目前确实有 data_columns:=['A']
,但我不记得这是怎么发生的。 (也许最初的 df 是用不同的参数编写的(我连续几天添加到 hdfstore,我可能已经改变了一些东西)。无论如何,不管它是如何创建的,我想索引额外的列。
显然,简单地调用 mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full')
是行不通的。我第一次 运行 它搅动了一个小时,文件大小增加了 2 GB(检查元数据显示块大小增加了),但我没有所有 3 个索引(只有 [=57 的索引) =]). 如何为所有 3 列生成索引?
我还注意到 ptdump 中的这一行——我有 "non_index_axes" 用于我想要索引的项目,这似乎令人不安:non_index_axes := [(1, ['A', 'B', 'C'])]
如果无法在 pandas 中创建索引,我将不胜感激有关如何直接在 pytables 中执行此操作的建议。 (例如,我是否需要先删除任何现有索引?如何修改 "non_index_axes" 和 "data_coumns")
编辑:关于我的用例的预期问题,这是我正在努力完成的事情的大图:
从 CSV 文件中读取 120 GB 的数据。每个文件代表一天的财务数据,由 100,000 行组成,每行大约有十二列。我只是将每一行按顺序存储在 HDF5 文件中。我希望这个初始阶段能够快速 运行,因此我关闭了索引。目前我在 6 秒内读取和解析每个 CSV 文件,并且像上面那样存储到 HDF5 文件只需要 1.5 秒。
索引少数(不是全部)列以支持各种查询,例如在第 1 列中获取具有给定字符串的所有项目,并在某个 运行ge.
随着时间的推移,每天我都会解析一个新的CSV文件并将其添加到HDF5文件中。我希望指数会继续更新。
(根据我的访问模式,我存储行的顺序(目前,按日期)可能仍然是检索的最佳顺序。我可能最终还需要按不同的顺序排序大多数查询中的列,在这种情况下,我认为我需要在解析和附加每个 CSV 文件后重新排序 table。)
目前我卡在第 2 步,生成列索引。
我会做一些不同的 - :
for chunk in ... # reading data in chunks:
# specify `data_columns`, but don't index (`index=False`)
hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False)
# index columns explicitly
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full')
我使用 pandas 创建了一个大型(120GB;10 亿行)HDF5 文件。在最初创建 hdf 文件后,我像这样添加到文件中:
with pd.get_store(path_output) as hdf_output:
for i in range(BIG_LOOP):
df = ...
hdf_output.append('all', df, data_columns=[])
我故意设置 data_columns=[] 以避免在创建时建立索引。现在我有了 HDF 文件,我想将索引添加到多个列(例如,columns_to_index=['A'、'B'、'C'])
不知何故,根据 ptdump,我目前确实有 data_columns:=['A']
,但我不记得这是怎么发生的。 (也许最初的 df 是用不同的参数编写的(我连续几天添加到 hdfstore,我可能已经改变了一些东西)。无论如何,不管它是如何创建的,我想索引额外的列。
显然,简单地调用 mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full')
是行不通的。我第一次 运行 它搅动了一个小时,文件大小增加了 2 GB(检查元数据显示块大小增加了),但我没有所有 3 个索引(只有 [=57 的索引) =]). 如何为所有 3 列生成索引?
我还注意到 ptdump 中的这一行——我有 "non_index_axes" 用于我想要索引的项目,这似乎令人不安:non_index_axes := [(1, ['A', 'B', 'C'])]
如果无法在 pandas 中创建索引,我将不胜感激有关如何直接在 pytables 中执行此操作的建议。 (例如,我是否需要先删除任何现有索引?如何修改 "non_index_axes" 和 "data_coumns")
编辑:关于我的用例的预期问题,这是我正在努力完成的事情的大图:
从 CSV 文件中读取 120 GB 的数据。每个文件代表一天的财务数据,由 100,000 行组成,每行大约有十二列。我只是将每一行按顺序存储在 HDF5 文件中。我希望这个初始阶段能够快速 运行,因此我关闭了索引。目前我在 6 秒内读取和解析每个 CSV 文件,并且像上面那样存储到 HDF5 文件只需要 1.5 秒。
索引少数(不是全部)列以支持各种查询,例如在第 1 列中获取具有给定字符串的所有项目,并在某个 运行ge.
随着时间的推移,每天我都会解析一个新的CSV文件并将其添加到HDF5文件中。我希望指数会继续更新。
(根据我的访问模式,我存储行的顺序(目前,按日期)可能仍然是检索的最佳顺序。我可能最终还需要按不同的顺序排序大多数查询中的列,在这种情况下,我认为我需要在解析和附加每个 CSV 文件后重新排序 table。)
目前我卡在第 2 步,生成列索引。
我会做一些不同的 -
for chunk in ... # reading data in chunks:
# specify `data_columns`, but don't index (`index=False`)
hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False)
# index columns explicitly
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full')