循环导致DataFrame重复500次,求更优雅的多DataFrame合并方案
问题原因
你输出重复500次的核心原因是:每个Excel的Summary工作表包含500行数据,执行data["Batch"] = data.iloc[0, 2]时,会给这500行每一行都赋值同一个Batch值,最终合并后自然会出现大量重复的Batch记录。
优雅的合并方案
根据你的需求,分两种场景优化:
场景1:仅需要每个Excel文件对应的Batch值
不需要加载整个工作表,只提取目标Batch值并生成单行DataFrame,这样合并后不会有重复:
import pandas as pd import glob path = r"C:\Users\A\Downloads\*.xls" # 用列表推导式批量处理,仅提取每个文件的Batch值 batch_list = [ pd.DataFrame({"Batch": [pd.read_excel(file, sheet_name="Summary").iloc[0, 2]]}) for file in glob.glob(path) ] final_data = pd.concat(batch_list, ignore_index=True) print(final_data)
场景2:需要保留原工作表数据,同时去除Batch列重复展示
如果你的真实需求是给每个文件的数据集标记Batch,但后续只需要唯一的Batch值展示,可以用drop_duplicates()去重:
import pandas as pd from tqdm import tqdm import glob path = r"C:\Users\A\Downloads\*.xls" list_data = [] for file in tqdm(glob.glob(path)): data = pd.read_excel(file, sheet_name="Summary") data["Batch"] = data.iloc[0, 2] list_data.append(data) final_data = pd.concat(list_data, ignore_index=True)[["Batch"]].drop_duplicates() print(final_data)
大文件场景的内存优化写法
如果待处理的Excel文件数量多、体积大,用生成器替代列表存储DataFrame,避免一次性加载所有数据到内存:
import pandas as pd import glob path = r"C:\Users\A\Downloads\*.xls" def load_batch_data(file): df = pd.read_excel(file, sheet_name="Summary") df["Batch"] = df.iloc[0, 2] return df # 生成器表达式,逐文件处理并合并 final_data = pd.concat((load_batch_data(file) for file in glob.glob(path)), ignore_index=True)[["Batch"]].drop_duplicates() print(final_data)
内容的提问来源于stack exchange,提问作者Hertyuw
相关产品推荐
相关产品推荐

