You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Feather读写pd.cut生成的数据时读取失败报错求助

问题

使用Feather读写包含pd.cut生成的类别型数据时抛出错误:

ArrowInvalid: Ran out of field metadata, likely malformed

出错代码示例:

dg = pd.DataFrame({'A': pd.cut((1, 2, 3), bins=[0, 1, 2])})
file_name = 'myfile.feather'
dg.to_feather(file_name)
dg = pd.read_feather(file_name)

注:to_feather步骤未报错,仅读取时触发错误。

测试确认普通类别变量可正常读写,说明问题仅针对pd.cut返回的特殊区间类别类型:

dg = pd.DataFrame({"A": list("123321")}, dtype="category")
file_name = 'myfile.feather'
dg.to_feather(file_name)
dg = pd.read_feather(file_name)

需求:通过Feather持久化DataFrame时,完整保留pd.cut生成的类别元数据。

环境:pandas 1.5.3、pyarrow 11.0.0、Python 3.8.13(Linux系统)


解决建议

1. 转换为普通类别类型后保存

pd.cut生成的是IntervalCategory类型,Feather对其元数据处理存在兼容问题。可先将该列转为普通类别类型,保留区间字符串作为类别值,读取后再还原:

# 生成数据
dg = pd.DataFrame({'A': pd.cut((1, 2, 3), bins=[0, 1, 2])})
# 转换为普通category
dg['A'] = dg['A'].astype('category')
# 保存到Feather
file_name = 'myfile.feather'
dg.to_feather(file_name)

# 读取并还原为IntervalCategory
dg_read = pd.read_feather(file_name)
dg_read['A'] = pd.IntervalIndex(dg_read['A']).astype('category')

2. 升级依赖库版本

该兼容性问题在pandas和pyarrow的新版本中已修复,建议升级到匹配的版本组合:

  • 将pandas升级至2.0及以上版本
  • 对应升级pyarrow至14.0及以上版本(参考pandas官方版本兼容矩阵)
    升级后无需修改代码,即可正常读写并保留pd.cut的类别元数据。

3. 临时用Pickle替代(不推荐长期使用)

若暂时无法升级依赖,可使用Pickle序列化保存,能完整保留所有元数据,但会丢失Feather的跨语言支持、高读写速度等优势:

dg.to_pickle('myfile.pkl')
dg_read = pd.read_pickle('myfile.pkl')

内容的提问来源于stack exchange,提问作者gg99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:35:13