如何快速存储包含列表字段的pandas DataFrame以降低加载耗时?
解决方案
方案1:优先使用Parquet列式二进制存储(推荐)
Parquet是列式二进制存储格式,原生支持嵌套列表类型,不需要做任何序列化/反序列化转换,读写性能远高于CSV,同时压缩率高,占用磁盘空间更小,300万行数据通常1分钟内即可完成加载,完全不需要额外处理列表字段的类型转换。
使用前需安装依赖:pip install pyarrow
代码示例:
- 存储:
df.to_parquet("output.parquet", compression="snappy") - 加载:
df = pd.read_parquet("output.parquet")
方案2:必须使用CSV时改用分隔符拼接替代序列化
如果因为业务要求必须存CSV格式,不要把列表存为Python字面量,提前把列表元素用罕见分隔符(比如|、\001,确保不会和文本字段内容冲突)拼接为字符串后再存储,加载时直接拆分即可,性能远高于eval转换。
代码示例:
- 存储前预处理:
df["list_field"] = df["list_field"].str.join("|") - 存CSV:
df.to_csv("output.csv", encoding="latin-1", index=False) - 加载后处理:
df = pd.read_csv("output.csv", encoding="latin-1") df["list_field"] = df["list_field"].str.split("|")
方案3:临时自用场景可直接用Pickle序列化
你之前对Pickle的认知有误,Pickle是Python原生的对象序列化格式,会完整保留DataFrame的所有数据类型,包括列表字段,加载时不需要额外转换,性能也很高。
注意:Pickle存在Python版本、Pandas版本兼容性问题,不适合跨环境共享数据,仅适合自用临时存储。
代码示例:
- 存储:
df.to_pickle("output.pkl") - 加载:
df = pd.read_pickle("output.pkl")
内容的提问来源于stack exchange,提问作者Desi Pilla
相关产品推荐
相关产品推荐

