使用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
相关产品推荐
相关产品推荐

