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

如何在保存与加载Pandas DataFrame时保留列表类型列?

解决方案:保存带列表列的Pandas DataFrame并保留类型

针对你遇到的csv转字符串、eval效率低、pickle报错的问题,这里有几个高效可行的方案:

1. 使用Parquet/Feather二进制格式(推荐)

这两种格式是为大数据场景设计的,原生支持复杂数据类型(比如列表),读写速度快还能压缩,是目前最推荐的方案。

步骤:
首先需要安装依赖库(二选一即可):

pip install pyarrow  # 推荐,兼容性好
# 或者
pip install fastparquet

保存与加载代码:

import pandas as pd

# 保存DataFrame
df.to_parquet('your_data.parquet')  # 或者用 df.to_feather('your_data.feather')

# 加载DataFrame
loaded_df = pd.read_parquet('your_data.parquet')  # 对应 pd.read_feather('your_data.feather')

优点:

  • 完全保留列表等复杂类型,无需额外转换
  • 读写速度远快于csv和pickle
  • 文件体积小(支持压缩)
  • 跨语言兼容(比如可以用R、Spark等读取)

2. 使用HDF5格式

Pandas原生支持HDF5格式,适合存储大型复杂数据集,也是一个稳定的选择。

步骤:
先安装依赖:

pip install tables

保存与加载代码:

import pandas as pd

# 保存DataFrame
df.to_hdf('your_data.h5', key='df', mode='w')  # key用于标识HDF文件中的数据集

# 加载DataFrame
loaded_df = pd.read_hdf('your_data.h5', key='df')

优点:

  • 原生支持复杂类型,无需转换
  • 支持增量写入(适合不断追加数据的场景)
  • 适合超大型DataFrame

3. 修复Pickle序列化问题

你之前遇到的UnpicklingError大概率是保存方式错误(比如误将csv文件当成pickle加载,或者保存时用了错误的方法),正确使用pickle是可以完美保留列表的。

正确的保存与加载代码:

import pandas as pd

# 方法1:用Pandas自带的pickle工具
df.to_pickle('your_data.pkl')
loaded_df = pd.read_pickle('your_data.pkl')

# 方法2:直接用Python的pickle模块
import pickle
with open('your_data.pkl', 'wb') as f:
    pickle.dump(df, f)

with open('your_data.pkl', 'rb') as f:
    loaded_df = pickle.load(f)

注意:

  • 确保保存和加载的是同一个文件,不要把csv文件后缀改成.pkl来加载,这会导致报错
  • Pickle仅支持Python环境,跨语言兼容性差

4. 优化CSV场景的类型转换(仅当必须用CSV时)

如果因为某些限制必须使用CSV格式,可以用ast.literal_eval替代eval(),它更安全且效率略高(虽然还是不如二进制格式):

import pandas as pd
import ast

# 保存CSV
df.to_csv('your_data.csv', index=False)

# 加载并转换列表列
loaded_df = pd.read_csv('your_data.csv')
loaded_df['lists'] = loaded_df['lists'].apply(ast.literal_eval)

缺点:

  • 速度慢,1万行数据虽然能处理,但远不如二进制格式高效
  • 若列表中包含特殊字符,可能会转换失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:57:58