使用for循环结合concat合并多个DataFrame时旧数据被覆盖如何解决
问题原因
你的代码核心问题出在all_dfs = pd.concat([df])这一行:
pd.concat传入的列表仅包含当前循环读取到的单个df,拼接结果只有当前df的数据- 每次循环都直接对
all_dfs重新赋值,自然会覆盖上一轮存储的历史数据
解决方案
推荐采用「先收集所有DataFrame到列表,循环结束后一次性合并」的方案,该方案也是Pandas官方推荐的多DataFrame合并最佳实践,相比循环中逐次拼接的执行效率高很多。
修正后的完整代码如下:
import pandas as pd # 循环开始前先定义空列表,存储每轮处理好的df df_list = [] for i in vd_files_list: ### 提取不含VD的场景名称 print(i) scenario_name_w_vd = i.split("/")[-1] scenario_name = scenario_name_w_vd.split(".")[0] try: VD_filename = r"{}".format(i) df = pd.read_csv(filepath_or_buffer=VD_filename, skiprows=13, names=("Attribute", "Commodity", "Process", "Period","Region", "Vintage", "TimeSlice", "UserConstraint","PV"), dtype={"Attribute":str, "Commodity":str, "Process":str, "Period":str,"Region":str, "Vintage":str, "TimeSlice":str, "UserConstraint":str,"PV":float}) # 新增名为“Szenario”的列,填入当前场景名称 df["Szenario"] = scenario_name # 把当前df追加到列表中 df_list.append(df) # 补全异常捕获逻辑,避免单个文件读取失败导致整个程序中断 except Exception as e: print(f"读取文件{i}失败,错误信息:{e}") # 所有循环结束后,一次性合并列表里的所有df all_dfs = pd.concat(df_list, ignore_index=True) print(all_dfs)
补充说明
- 代码中补全了
try对应的异常捕获逻辑,避免单个文件读取失败导致整个循环中断 pd.concat的ignore_index=True参数会重置合并后DataFrame的行索引,避免多个原始df的行索引重复的问题- 如果你的业务场景必须在循环过程中实时拿到合并后的结果,可以把拼接逻辑改为
all_dfs = pd.concat([all_dfs, df], ignore_index=True),但需要注意循环开始前要先初始化all_dfs = pd.DataFrame(),该方案仅适合少量df合并的场景,数据量大时会有明显的性能问题
内容的提问来源于stack exchange,提问作者Pit96
相关产品推荐
相关产品推荐

