如何在保存与加载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
相关产品推荐
相关产品推荐

