多DataFrame按id过滤合并遇运行慢、结果冗余,求优化方案
问题分析与优化方案
原代码的问题出在哪
- 起点错误:你拿未过滤的
df_list[0]当合并起点,不是过滤后的dfs[0],直接把整个大表拉进来合并,速度慢不说,结果自然冗余。 - 合并逻辑失效:循环里每次合并都直接覆盖
dfall,最后只留下最后两个表的合并结果,前面的表根本没参与合并,等于白做了。 - 未处理列名冲突:如果多个表有除
id外的同名列,合并后会生成一堆col_x/col_y的重复列,多次合并后更乱。
优化后的代码
from functools import reduce import pandas as pd df_list = [df1, df2, df3, df4, df5, df6] lis = ["PT08"] # 第一步:高效过滤所有表,转集合提升isin查询速度 filtered_dfs = [df[df['id'].isin(set(lis))] for df in df_list] # 第二步:批量合并所有过滤后的表 def merge_tables(left, right): # 给重复列加后缀,避免冲突 return left.merge(right, on='id', how='inner', suffixes=('_from_left', '_from_right')) # 用reduce实现累积合并 dfall = reduce(merge_tables, filtered_dfs)
优化细节说明
- 过滤提速:把
lis转成集合,集合的成员查询比列表快得多,数据量越大优势越明显;用列表推导式替代循环append,代码更简洁,执行效率也更高。 - 合并逻辑修正:
reduce会自动把所有过滤后的表依次合并,确保每个表都参与进来;如果想保留所有符合过滤条件的id(哪怕某些表没对应数据),把how='inner'改成how='outer'就行。 - 列名冲突处理:通过
suffixes给重复列加后缀,能清楚区分不同表的同名字段,避免后续数据混乱。
结果冗余的解决
之前结果超大,就是因为你用了未过滤的大表当合并起点,现在全用过滤后的小表合并,只会保留id在lis里的数据,结果规模会正常缩小,且符合预期。
内容的提问来源于stack exchange,提问作者user14269252
相关产品推荐
相关产品推荐

