Python中含string集合列的Parquet转Pandas DataFrame报错解决
解决fastparquet转DataFrame时的Encoding 4错误
这个问题我之前也碰到过,本质是fastparquet对Parquet文件中的集合类型(比如你提到的字符串集合)的编码支持不完善,导致抛出NotImplementedError: Encoding 4。这里给你两个可行的解决方案:
方法一:换用pyarrow读取(推荐)
pyarrow对Parquet的复杂类型支持比fastparquet更全面,完全能处理这种字符串集合列。代码很简单:
import pyarrow.parquet as pq # 读取Parquet文件 table = pq.read_table('inout_files.parquet') # 转成Pandas DataFrame df = table.to_pandas()
这样就能直接把包含字符串集合的列正常解析成Pandas中的列表/集合类型,不会报错。
方法二:用fastparquet手动处理有问题的列
如果你因为某些原因必须用fastparquet,可以分两步处理:先读取正常的列,再单独解析有问题的集合列。
步骤如下:
- 先获取所有列名,排除有问题的列,读取正常列到DataFrame:
from fastparquet import ParquetFile import pandas as pd pf = ParquetFile('inout_files.parquet') # 假设问题列名为'problem_col',替换成你实际的列名 good_cols = [col for col in pf.columns if col != 'problem_col'] df = pf.to_pandas(columns=good_cols)
- 单独读取问题列的原始数据,解析集合类型:
# 获取问题列的原始数据块 problem_col_data = [] for row_group in pf.row_groups: # 定位问题列的chunk col_chunk = next(chunk for chunk in row_group.columns if chunk.name == 'problem_col') # 读取原始二进制数据并解析 data = pf.read_row_group(row_group, columns=['problem_col'])['problem_col'] # 把每个元素转成Python集合/列表,根据你的需求调整 parsed_data = [set(item) if item is not None else None for item in data] problem_col_data.extend(parsed_data) # 把解析后的列加入DataFrame df['problem_col'] = problem_col_data
这种方法需要手动处理编码逻辑,不如pyarrow省心,但能满足必须用fastparquet的场景。
内容的提问来源于stack exchange,提问作者Reyhaneh
相关产品推荐
相关产品推荐

