Python中基于匹配案例复制DataFrame初始化对象的实现问题
优化DataFrame加载与复制逻辑,避免重复初始化
问题背景
- 需为案例列表
["case1", "case2", "case3", "case4"]加载或复制内部DataFrame,初始化DataFrame耗时较长 - 匹配规则字典
{"case1": ["case1", "case2", "case3"], "case4": ["case4"]}定义了同配置案例组,每组内只需初始化一个案例的DataFrame,其余直接复制即可 - 当前代码存在逻辑缺陷:当已存储case2和case4的DataFrame文件时,未正确通过复制得到case1、case3的DataFrame,仍会重复初始化
原代码核心问题分析
- 复制逻辑方向错误:遍历匹配组时,错误地检查当前未加载案例是否在已加载列表中,而非在同组内寻找已加载的案例
- 列表操作错误:遍历
unavailable_cases时直接修改列表会引发遍历异常;available_cases是列表却使用集合的add()方法,会抛出AttributeError - 流程顺序混乱:复制逻辑未优先完成所有可复用的案例,就直接进入初始化流程,导致本该复制的案例被重复初始化
修正后的完整代码
import os from copy import deepcopy # 假设DataFrame_from_csv、get_plates等函数已定义 def load_data(data, reconstruction, reconstruction_name, reconstruction_times, type, all_cases, all_options, matching_case_dict, topologies, rotations, files_dir): # 遍历每个时间节点 for reconstruction_time in reconstruction_times: data[reconstruction_time] = {} # 初始化已加载/未加载案例列表 unavailable_cases = deepcopy(all_cases) available_cases = [] # 第一步:加载已存在的文件 if files_dir: for case in all_cases: file_path = os.path.join(files_dir, f"{case}_{reconstruction_name}_{reconstruction_time}.csv") if os.path.exists(file_path): data[reconstruction_time][case] = DataFrame_from_csv(files_dir, case, reconstruction_time, reconstruction_name, type) unavailable_cases.remove(case) available_cases.append(case) else: print(f"未找到{type}类型 {reconstruction_name} 在{reconstruction_time} Ma 案例{case}的DataFrame,将检查同组案例...") # 第二步:处理可复制的未加载案例 # 遍历未加载案例的副本,避免遍历中修改原列表引发异常 for unavailable_case in list(unavailable_cases): # 找到当前案例所属的匹配组 for group_key, group_cases in matching_case_dict.items(): if unavailable_case in group_cases: # 在组内寻找已加载的案例 for existing_case in group_cases: if existing_case in available_cases: # 复制已加载的DataFrame data[reconstruction_time][unavailable_case] = data[reconstruction_time][existing_case].copy() available_cases.append(unavailable_case) unavailable_cases.remove(unavailable_case) print(f"通过复制{existing_case}的DataFrame完成{unavailable_case}的初始化") break # 找到可用案例后跳出循环 break # 找到所属组后跳出循环 # 第三步:初始化剩余无法复制的案例 for unavailable_case in list(unavailable_cases): print(f"为{type}类型 {reconstruction_name} 在{reconstruction_time} Ma 案例{unavailable_case}初始化新的DataFrame...") if type == "Plates": data[reconstruction_time][unavailable_case] = get_plates(topologies, rotations, reconstruction_time, 1, all_options[unavailable_case]["Anchor plateID"]) elif type == "Slabs": data[reconstruction_time][unavailable_case] = get_slabs(reconstruction, reconstruction_time, all_options[unavailable_case]["Slab tesselation spacing"]) elif type == "Points": data[reconstruction_time][unavailable_case] = get_points(reconstruction, reconstruction_time, all_options[unavailable_case]["Grid spacing"]) available_cases.append(unavailable_case) unavailable_cases.remove(unavailable_case) return data
关键修改说明
- 重构复制逻辑:先定位未加载案例所属的匹配组,再在组内查找已加载的案例,找到后直接复制其DataFrame,避免无效遍历
- 安全修改列表:遍历
unavailable_cases的副本(list(unavailable_cases)),避免遍历过程中修改原列表导致的索引异常 - 调整流程顺序:将复制流程放在初始化流程之前,确保所有可复用的案例都优先通过复制完成初始化,仅剩余无同组已加载案例的情况才触发初始化
- 修复方法调用错误:将
available_cases.add()改为available_cases.append(),符合列表操作规范 - 优化条件判断:初始化部分使用
elif替代多个if,避免不必要的条件检查
内容的提问来源于stack exchange,提问作者Geo_toto
相关产品推荐
相关产品推荐

