pandas保存DataFrame至feather格式丢失object dtype的原因与解决办法
问题原因
Feather格式底层基于Apache Arrow的强类型列式存储规范,本身没有对应pandas通用object dtype的原生实现:
- pandas的
objectdtype是万能容器,可存储任意类型的Python对象,没有明确的类型约束 - 写入Feather时,Arrow会自动推断
object列内实际存储的元素类型,用匹配的原生Arrow类型存储以提升效率。你测试用的state列的object容器内全是整数,因此会被自动转为Arrow的int64类型存储,读取时自然还原为pandas的int64 dtype,原本的object标记就丢失了。
规避方案
根据你的需求,有两种成熟方案可选:
方案1:使用pandas专属String类型(最推荐)
将需要保留为字符串的列显式转换为pandas的string dtype,而非用通用object存储,该类型可被Feather完美兼容持久化:
# 写入前转换类型 d["state"] = d["state"].astype("string") d.to_feather("test.feather") # 读取后自动保持string类型,无需额外转换 d = pandas.read_feather("test.feather") print(d.dtypes["state"]) # 输出string
该方案相比通用object类型,存储效率更高,且自带字符串专属方法,类型安全也更好。
方案2:读取时指定dtype(适合必须保留object类型的场景)
如果你的业务逻辑强依赖object dtype,可以在读取时直接指定目标类型,无需后续额外转换:
d = pandas.read_feather("test.feather", dtype={"state": object}) print(d.dtypes["state"]) # 输出object
内容的提问来源于stack exchange,提问作者PatrickT
相关产品推荐
相关产品推荐

