关于Parquet将DataFrame中的元组转换为列表的技术咨询
Parquet读写DataFrame时元组转为列表:设计而非Bug
这是设计使然,并非Bug,原因如下:
- Parquet是跨语言的列式存储格式,它依赖的Arrow类型规范里没有专门对应Python元组的类型。元组作为Python特有的不可变序列,会被自动转换为Arrow的列表类型(可变序列)来适配格式要求,读取时自然还原为列表。
- 列表和字典能正常还原,是因为Arrow有对应的列表、结构体类型,可与pandas的类型直接映射匹配。
- Pickle是Python专属序列化工具,会完整保留对象的原生类型信息,所以能准确读写元组。
验证代码
import pandas as pd df = pd.DataFrame([[(0,1)]], columns=['tuple']) print("原DataFrame及元素类型:") print(df) print(f"元组列元素类型:{type(df['tuple'].iloc[0])}") df.to_parquet('t') df2 = pd.read_parquet('t', engine='pyarrow') print("\n读取后的DataFrame及元素类型:") print(df2) print(f"读取后列元素类型:{type(df2['tuple'].iloc[0])}")
保留元组类型的处理方法
- 读取后手动转换列元素类型:
df2['tuple'] = df2['tuple'].apply(tuple) - 若需长期存储元组结构,要么用Pickle(注意跨语言兼容性差),要么将元组拆分为独立列(更贴合Parquet的列式存储设计)。
内容的提问来源于stack exchange,提问作者BSalita
相关产品推荐
相关产品推荐

