带多级索引的空DataFrame存为Parquet后pd.read_parquet读取报错如何解决
问题根因
该报错属于低版本pyarrow与pandas的已知兼容问题:使用df.loc[[], []]同时将行、列裁剪为空时,MultiIndex列的类型元信息在转换为pyarrow表的过程中会丢失正常结构,被识别为dict类型,pandas读取时无法解析该结构就会抛出AttributeError: 'dict' object has no attribute 'dtype'。
解决方案
1. 使用head(0)生成空表(最优雅)
df.head(0)是pandas官方推荐的生成保留完整索引/列结构空表的方法,不管是普通索引还是MultiIndex都可以完整保留元信息,无需手动使用loc裁剪:
# 替换原有 df = df.loc[[], []] df = df.head(0)
后续读写parquet的逻辑无需修改,不会触发报错。
2. 调整读数据逻辑
如果不想修改写数据侧的代码,可以调整读数据的逻辑规避兼容问题:
# 替换原有 pd.read_parquet('my_table.parquet') df = pq.read_table('my_table.parquet').to_pandas()
3. 升级依赖版本(根本解决)
该兼容问题已在pandas 1.5.0+、pyarrow 10.0.0及以上版本修复,直接升级依赖包即可无需修改任何业务代码:
pip install --upgrade pandas pyarrow
内容的提问来源于stack exchange,提问作者abisko
相关产品推荐
相关产品推荐

