将具有对象 dtype 的数据帧写入 HDF5 仅在转换为字符串后才有效
Writing data frame with object dtype to HDF5 only works after converting to string
我有一个大数据数据框,我想将它写入磁盘以便快速检索。我相信 to_hdf(...)
推断列的数据类型,但有时会出错。我想知道正确的处理方法是什么。
import pandas as pd
import numpy as np
length = 10
df = pd.DataFrame({"a": np.random.randint(1e7, 1e8, length),})
# df.loc[1, "a"] = "abc"
# df["a"] = df["a"].astype(str)
print(df.dtypes)
df.to_hdf("df.hdf5", key="data", format="table")
取消注释各行会使我得到以下内容。
- 仅用数字填充列将导致数据类型
int32
并且存储没有问题
- 将一个元素设置为
abc
会将数据更改为对象,但似乎to_hdf
在内部推断出另一种数据类型并抛出错误:TypeError: object of type 'int' has no len()
- 将列显式转换为
str
会成功,并且 to_hdf
存储数据。
现在我想知道第二种情况发生了什么,有没有办法避免这种情况?我发现的唯一方法是遍历所有列,检查它们是否 dtype('O')
并将它们明确地转换为 str
.
我没有使用 hdf5,而是找到了一个似乎非常适合这项工作的通用 pickling 库:jiblib
存储和加载数据很简单:
import joblib
joblib.dump(df, "file.jl")
df2 = joblib.load("file.jl")
我有一个大数据数据框,我想将它写入磁盘以便快速检索。我相信 to_hdf(...)
推断列的数据类型,但有时会出错。我想知道正确的处理方法是什么。
import pandas as pd
import numpy as np
length = 10
df = pd.DataFrame({"a": np.random.randint(1e7, 1e8, length),})
# df.loc[1, "a"] = "abc"
# df["a"] = df["a"].astype(str)
print(df.dtypes)
df.to_hdf("df.hdf5", key="data", format="table")
取消注释各行会使我得到以下内容。
- 仅用数字填充列将导致数据类型
int32
并且存储没有问题 - 将一个元素设置为
abc
会将数据更改为对象,但似乎to_hdf
在内部推断出另一种数据类型并抛出错误:TypeError: object of type 'int' has no len()
- 将列显式转换为
str
会成功,并且to_hdf
存储数据。
现在我想知道第二种情况发生了什么,有没有办法避免这种情况?我发现的唯一方法是遍历所有列,检查它们是否 dtype('O')
并将它们明确地转换为 str
.
我没有使用 hdf5,而是找到了一个似乎非常适合这项工作的通用 pickling 库:jiblib
存储和加载数据很简单:
import joblib
joblib.dump(df, "file.jl")
df2 = joblib.load("file.jl")