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

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,可以分两步处理:先读取正常的列,再单独解析有问题的集合列。

步骤如下:

  1. 先获取所有列名,排除有问题的列,读取正常列到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)
  1. 单独读取问题列的原始数据,解析集合类型:
# 获取问题列的原始数据块
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:18