如何将多个 pandas 数据帧组合到一个键/组下的 HDF5 对象中?
Posted
技术标签:
【中文标题】如何将多个 pandas 数据帧组合到一个键/组下的 HDF5 对象中?【英文标题】:How do I combine multiple pandas dataframes into an HDF5 object under one key/group? 【发布时间】:2017-02-16 21:58:21 【问题描述】:我正在从 800 GB 的大型 csv 文件中解析数据。对于每一行数据,我将其保存为 pandas 数据框。
readcsvfile = csv.reader(csvfile)
for i, line in readcsvfile:
# parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
# save as pandas dataframe
df = pd.DataFrame(dictionary_line, index=[i])
现在,我想将其保存为 HDF5 格式,并像查询整个 csv 文件一样查询 h5。
import pandas as pd
store = pd.HDFStore("pathname/file.h5")
hdf5_key = "single_key"
csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
到目前为止,我的方法是:
import pandas as pd
store = pd.HDFStore("pathname/file.h5")
hdf5_key = "single_key"
csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)
for i, line in readcsvfile:
# parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
# save as pandas dataframe
df = pd.DataFrame(dictionary_line, index=[i])
store.append(hdf5_key, df, data_columns=csv_columns, index=False)
也就是说,我尝试将每个数据帧df
保存到一个键下的HDF5中。但是,这失败了:
Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index'
所以,我可以先尝试将所有内容保存到一个 pandas 数据框中,即
import pandas as pd
store = pd.HDFStore("pathname/file.h5")
hdf5_key = "single_key"
csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)
total_df = pd.DataFrame()
for i, line in readcsvfile:
# parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
# save as pandas dataframe
df = pd.DataFrame(dictionary_line, index=[i])
total_df = pd.concat([total_df, df]) # creates one big CSV
现在存储为 HDF5 格式
store.append(hdf5_key, total_df, data_columns=csv_columns, index=False)
但是,我认为我没有 RAM/存储空间来将所有 csv 行保存为 total_df
为 HDF5 格式。
那么,如何将每个“单行”df 附加到 HDF5 中,以便最终成为一个大数据帧(如原始 csv)?
编辑:这是一个具有不同数据类型的 csv 文件的具体示例:
order start end value
1 1342 1357 category1
1 1459 1489 category7
1 1572 1601 category23
1 1587 1599 category2
1 1591 1639 category1
....
15 792 813 category13
15 892 913 category5
....
【问题讨论】:
是否所有条目都属于同一类型? IRC,hdf5 不做混合数组。 @Paul 那么,如何将整个 +TB csv 数据表转换为 HDF5 格式? @MaxU 我知道你是 HDF5 专家。这可能吗?感觉是个很简单的任务…… @Paul 我应该为每个 csv 字段 COL1、COL2、.. 创建单独的列并从字典/熊猫数据框中附加值吗?我将如何处理“NaN”值?你有什么建议? @Ümit 您也是 StackOverlow 上著名的 HDF5 专家——这肯定是一项简单的任务,对吧?我应该以某种方式将每个字段值保存到单独的数组中,然后保存到 HDF5 中吗? (我不知道这是否会保留 csv“数据帧”结构,我担心在存储到 HDF5 之前保存巨大的数组时会遇到 RAM 问题...) 【参考方案1】:你的代码应该可以工作,你可以试试下面的代码:
import pandas as pd
import numpy as np
store = pd.HDFStore("file.h5", "w")
hdf5_key = "single_key"
csv_columns = ["COL%d" % i for i in range(1, 56)]
for i in range(10):
df = pd.DataFrame(np.random.randn(1, len(csv_columns)), columns=csv_columns)
store.append(hdf5_key, df, data_column=csv_columns, index=False)
store.close()
如果代码有效,则说明您的数据有问题。
【讨论】:
这段代码确实有效——但我不确定我的数据可能有什么“错误”。我收到两个错误:Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index'
或 ValueError: cannot match existing table structure for [COLl1, COL2, COL3, COL4, COL5, ...] on appending data
实际上,这个例子有效并且我抛出错误ValueError: cannot match existing table structure for [COLl1, COL2, COL3, COL4, COL5, ...] on appending data
的原因似乎是我的数据有多种类型。如果df
的列有字符串、整数、浮点数等,你会怎么做?
@ShanZhengYang 如果你有一列同时包含字符串和数字,请先将所有值转换为字符串或数字。以上是关于如何将多个 pandas 数据帧组合到一个键/组下的 HDF5 对象中?的主要内容,如果未能解决你的问题,请参考以下文章
将多个键上的 pandas 数据帧映射为列或 multiIndex
python:pandas - 如何将前两行 pandas 数据帧组合到数据帧头?