Python处理大量文件时替代for循环拼接DataFrame的高效方案求助
优化数百个数据文件处理效率的Python方案
1. 并行处理文件IO与计算
单线程循环处理会浪费大量等待文件读取的时间,用多进程/多线程并行处理能直接提升效率:
- IO密集型任务(文件读取占比高):用
concurrent.futures.ThreadPoolExecutor,开销更小 - 计算密集型任务:用
concurrent.futures.ProcessPoolExecutor,规避Python GIL限制
示例代码:
import pandas as pd from concurrent.futures import ProcessPoolExecutor import glob def process_single_file(file_path): # 读取文件(根据实际格式替换read_csv) df = pd.read_csv(file_path) # 执行你的公式处理,确保用Pandas向量化操作 df['calc_result'] = df['col_a'] * df['col_b'] - df['col_c'] return df # 获取所有目标文件路径 file_paths = glob.glob('./data_dir/*.csv') # 并行处理所有文件 with ProcessPoolExecutor() as executor: processed_dfs = list(executor.map(process_single_file, file_paths)) # 一次性合并所有DataFrame final_df = pd.concat(processed_dfs, ignore_index=True)
2. 杜绝循环内反复拼接DataFrame
你当前方案的核心性能瓶颈大概率是每次循环用pd.concat拼接空DataFrame——每次拼接都会创建新对象,内存开销和时间成本随文件数量指数增长。改成先把处理好的DataFrame存入列表,最后一次性合并,能直接减少90%以上的拼接耗时。
3. 优化文件读取速度
根据文件类型选择更高效的读取方式:
- CSV文件:用
pd.read_csv时指定dtype固定数据类型,避免Pandas自动推断浪费时间;或直接用dask.dataframe.read_csv批量读取 - Excel文件:优先转成CSV格式再处理(Excel读取本身效率极低),必须读Excel的话用
openpyxl的只读模式 - 频繁复用的数据集:转存为
feather或parquet二进制格式,读取速度比文本格式快5-10倍
4. 用向量化计算替代逐行处理
确保你的公式处理是Pandas向量化操作,比如用df['col1'] * df['col2']代替df.apply(lambda x: x['col1']*x['col2'], axis=1)。向量化操作是C级执行效率,比Python循环快几个数量级。
5. 超大规模数据用Dask(可选)
如果数据量超出内存上限,用Dask DataFrame替代Pandas——它会自动分块、并行处理,接口和Pandas几乎一致,无需大幅修改代码:
import dask.dataframe as dd # 批量读取所有文件 ddf = dd.read_csv('./data_dir/*.csv') # 向量化处理数据 ddf['calc_result'] = ddf['col_a'] * ddf['col_b'] - ddf['col_c'] # 计算并转成Pandas DataFrame(内存足够时) final_df = ddf.compute()
内容的提问来源于stack exchange,提问作者Rifat Kamarudheen
相关产品推荐
相关产品推荐

