在for循环中动态创建、合并并保存DataFrame的问题求助
问题分析与解决
核心错误原因
你的代码存在多个关键问题,直接导致了报错:
- 未读取Excel文件为DataFrame:
glob.glob返回的是文件路径字符串,你直接把这些字符串传给pd.merge,而merge要求传入的是Series或DataFrame对象,这是报错的直接原因。 - 循环逻辑错误:使用
zip会将两个列表的元素一一配对,无法实现每个技术文件与每个等级文件的交叉合并(4*3=12种组合)。 - 语法错误:字典键
d[level technology]的写法不合法,变量名不能直接拼接,需要用字符串格式化处理。 - 文件保存错误:调用
d.to_excel是错误的,应该针对每个合并后的DataFrame对象执行保存操作。 - 文件分类错误:两个
glob使用相同路径,无法区分等级和技术两类数据集,会把所有Excel文件混在一起。
修正后的代码
假设你的等级文件和技术文件可以通过文件名前缀区分(比如等级文件以level_开头,技术文件以tech_开头),或者存放在不同子文件夹,以下是修正后的代码:
import os import pandas as pd import glob # 1. 区分两类文件的路径或文件名,这里以文件名前缀为例 level_files = glob.glob("C:\\path\\level_*.xlsx") # 匹配所有等级文件 tech_files = glob.glob("C:\\path\\tech_*.xlsx") # 匹配所有技术文件 # 2. 存储合并后的DataFrame(可选,若不需要保留可省略字典) merged_dfs = {} # 3. 嵌套循环实现所有交叉组合的合并 for level_path in level_files: # 读取等级文件为DataFrame level_df = pd.read_excel(level_path) # 提取等级文件名(不含路径和后缀) level_name = os.path.splitext(os.path.basename(level_path))[0] for tech_path in tech_files: # 读取技术文件为DataFrame tech_df = pd.read_excel(tech_path) # 提取技术文件名(不含路径和后缀) tech_name = os.path.splitext(os.path.basename(tech_path))[0] # 按Location列内连接合并 merged_df = pd.merge(tech_df, level_df, how="inner", on="Location") # 生成唯一的字典键(可选) key = f"{tech_name}_merged_{level_name}" merged_dfs[key] = merged_df # 保存合并后的文件,文件名包含原文件名信息 save_name = f"{tech_name}_merged_{level_name}.xlsx" save_path = os.path.join("C:\\path\\merged_results", save_name) # 创建保存目录(如果不存在) os.makedirs(os.path.dirname(save_path), exist_ok=True) merged_df.to_excel(save_path, index=False)
关键修正点说明
- 文件读取:每次循环中用
pd.read_excel将文件路径转为DataFrame,确保merge的是合法对象。 - 交叉合并:使用嵌套循环遍历所有等级文件和技术文件的组合,生成4*3=12个合并结果。
- 文件名处理:用
os.path.basename和os.path.splitext提取纯文件名,避免路径干扰,生成清晰的合并文件名。 - 目录创建:用
os.makedirs确保保存目录存在,避免保存时因目录不存在报错。 - 字典存储:可选保留合并后的DataFrame到字典中,方便后续复用(若不需要可省略字典相关代码)。
内容的提问来源于stack exchange,提问作者Mlle Blanche
相关产品推荐
相关产品推荐

