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

将DataFrame存为Parquet时遇“Python int过大无法转C long”错误求助

解决保存大DataFrame到Parquet时的"Python int too large to convert to C long"错误

问题根源

这个错误并非字符串长度导致,而是Pandas处理object列转Parquet格式时的类型推断异常——要么列中混入了隐藏的大整数类型数据,要么超大行数下,Pandas默认的object类型存储触发了底层C类型溢出。你用astype('|S')转字节串的方式,并没有解决Parquet类型适配的核心问题。

可行解决方案

1. 用Pandas原生StringDtype替代object/字节串

Parquet对Pandas原生字符串类型的支持更稳定,直接转换后再保存:

import pandas as pd

# 将目标列转为StringDtype
df['target_col'] = df['target_col'].astype('string')

# 指定pyarrow引擎保存(性能和兼容性更优)
df.to_parquet('path/file.parquet', engine='pyarrow')

如果未安装pyarrow,先执行pip install pyarrow。

2. 清理列中潜在的非字符串异常值

超大行数下可能存在个别隐藏的非字符串数据(比如大整数、特殊空值),强制统一转为字符串:

# 强制将所有非空值转为字符串,空值设为空白字符串
df['target_col'] = df['target_col'].apply(lambda x: str(x) if pd.notna(x) else '')

# 转StringDtype后保存
df['target_col'] = df['target_col'].astype('string')
df.to_parquet('path/file.parquet', engine='pyarrow')

3. 分块写入超大DataFrame

7000万行的DataFrame内存压力极大,分块写入可避免内存溢出和底层类型转换错误:

chunk_size = 1000000  # 按内存情况调整每块行数
for idx, chunk in enumerate(pd.read_csv('source_data.csv', chunksize=chunk_size)):
    # 处理当前块的目标列
    chunk['target_col'] = chunk['target_col'].astype('string')
    # 第一块覆盖写入,后续块追加
    write_mode = 'w' if idx == 0 else 'a'
    chunk.to_parquet('path/file.parquet', engine='pyarrow', mode=write_mode)

若DataFrame不是来自CSV,可改用np.array_split(df, 8)拆分后分块处理。

4. 用Dask并行处理超大规模数据

如果内存不足,Dask可拆分数据集并行处理,规避单进程内存瓶颈:

import dask.dataframe as dd

# 将Pandas DataFrame转为Dask DataFrame,按CPU核心数设置分区
ddf = dd.from_pandas(df, npartitions=8)
# 转换列类型
ddf['target_col'] = ddf['target_col'].astype('string')
# 保存Parquet
ddf.to_parquet('path/dask_file.parquet', engine='pyarrow')

关键注意事项

  • 避免使用astype('|S')字节串类型,Parquet对Pandas StringDtype的适配性更好。
  • 优先选择pyarrow引擎,比默认的fastparquet在处理超大数据集和复杂字符串时更稳定。
  • 超大DataFrame务必关注内存占用,分块或使用Dask是更稳妥的方案。

内容的提问来源于stack exchange,提问作者Sierd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:33:57