pandas批量读取大Excel文件耗时久,如何持久化存储DataFrame对象复用?
解决方案
你可以通过序列化pandas DataFrame到本地文件的方式实现一次读取、多次复用,下面是3种常用的可行方案,按照实现复杂度从低到高排列:
方案1:使用pickle格式(最便捷,优先推荐)
pickle是Python原生的序列化格式,可以完整保留DataFrame的所有结构信息,不需要额外安装依赖,读写速度极快,读取完成后的DataFrame和直接从Excel读取的结构完全一致。
第一次运行(读取Excel并生成缓存文件)代码:
import pandas as pd import os path = r'C:/Users/damia/Dropbox/Tesi/WIOD' dirs = os.listdir(path) complete_dirs = [] for f in dirs: complete_dirs.append(path + r"/" + f) data = [] for el in complete_dirs: wiod = pd.read_excel(el, engine='pyxlsb') data.append(wiod) # 序列化存储到本地,生成的pkl文件就是缓存文件 pd.to_pickle(data, 'wiod_all_data.pkl')
后续运行直接读取缓存的代码:
import pandas as pd data = pd.read_pickle('wiod_all_data.pkl')
常规配置下读取时间可以压缩到几秒以内。
方案2:使用Feather格式(跨语言兼容,读写速度快)
如果需要在Python之外的其他语言(比如R)也用到这批数据,可以用Feather格式,需要先安装依赖:pip install pyarrow
存储代码:
# 因Feather不支持直接存储列表,可将14个DataFrame分开存储 for idx, df in enumerate(data): df.to_feather(f'wiod_data_{idx}.feather')
读取代码:
data = [] for i in range(14): df = pd.read_feather(f'wiod_data_{i}.feather') data.append(df)
方案3:使用Parquet格式(高压缩比,节省存储空间)
如果磁盘空间比较紧张,推荐用Parquet格式,压缩率比前两种高30%以上,适合长期存储,同样需要pyarrow依赖。
存储代码:
for idx, df in enumerate(data): df.to_parquet(f'wiod_data_{idx}.parquet')
读取代码:
data = [] for i in range(14): df = pd.read_parquet(f'wiod_data_{i}.parquet') data.append(df)
优化逻辑
可以增加自动判断逻辑,只要缓存文件存在就直接读缓存,不存在再读Excel,不需要手动切换代码:
import pandas as pd import os cache_path = 'wiod_all_data.pkl' if os.path.exists(cache_path): # 缓存存在直接读 data = pd.read_pickle(cache_path) else: # 缓存不存在就读Excel生成缓存 path = r'C:/Users/damia/Dropbox/Tesi/WIOD' dirs = os.listdir(path) complete_dirs = [os.path.join(path, f) for f in dirs] data = [pd.read_excel(el, engine='pyxlsb') for el in complete_dirs] pd.to_pickle(data, cache_path)
内容的提问来源于stack exchange,提问作者Turtlein
相关产品推荐
相关产品推荐

