You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多DataFrame按id过滤合并遇运行慢、结果冗余,求优化方案

问题分析与优化方案

原代码的问题出在哪

  1. 起点错误:你拿未过滤的df_list[0]当合并起点,不是过滤后的dfs[0],直接把整个大表拉进来合并,速度慢不说,结果自然冗余。
  2. 合并逻辑失效:循环里每次合并都直接覆盖dfall,最后只留下最后两个表的合并结果,前面的表根本没参与合并,等于白做了。
  3. 未处理列名冲突:如果多个表有除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:35:20