Python脚本合并多文件夹Excel至DataFrame时遇索引重排错误
解决Reindexing only valid with uniquely valued Index objects错误并实现多Excel文件合并
错误原因分析
你的代码核心问题在于逻辑错位:
- 初始化
main_df时指定了目标数据列,但后续拼接的entry_df是将整个Excel的DataFrame作为单元格值存入'Data'列,两者结构完全不匹配,concat时Pandas尝试对齐索引和列,触发索引唯一性校验失败的错误。 - 另外,你试图把DataFrame作为单元格值存储的方式不符合合并数据的需求,正确的做法应该是给每个Excel的数据添加来源文件列后,直接合并行。
修正后的完整代码
import os import pandas as pd def read_excel_files_in_folder(folder_path): data_list = [] for root, dirs, files in os.walk(folder_path): for file in files: if file.endswith(".xlsx"): file_path = os.path.join(root, file) df = pd.read_excel(file_path) # 去重 df = df.drop_duplicates() # 清理字符串列的首尾空格 df = df.apply(lambda x: x.str.strip() if x.dtype == "O" else x) # 添加来源文件路径列 df['Source_File'] = file_path data_list.append(df) return data_list def main(input_folder, output_csv): # 读取所有Excel数据,返回DataFrame列表 df_list = read_excel_files_in_folder(input_folder) if not df_list: print("未找到任何Excel文件") return # 合并所有DataFrame,自动对齐列 main_df = pd.concat(df_list, ignore_index=True) # 如果你需要指定保留的列,可以在这里筛选(替换成你的目标列) # desired_columns = ["列1", "列2", "Source_File"] # main_df = main_df[desired_columns] # 保存为CSV output_path = os.path.join(output_csv, 'Datalab_output_data.csv') main_df.to_csv(output_path, index=False, encoding='utf-8-sig') print(f"文件已保存至: {output_path}") if __name__ == "__main__": input_folder = r"C:\Users\Edopi\OneDrive\Desktop\2022_2023" output_csv = r'C:\Users\Edopi\OneDrive\Desktop\2023-24b-fai1-adsai-EdoardoPierezza231412\Deliverables\Data_lab_preparetion' main(input_folder, output_csv)
关键修正点
- 调整
read_excel_files_in_folder函数:不再返回包含File和Data的字典列表,而是直接返回添加了Source_File列的DataFrame列表,每个DataFrame对应一个Excel文件的内容。 - 合并逻辑简化:直接用
pd.concat合并所有DataFrame,ignore_index=True重置索引,避免索引冲突。 - 可选列筛选:如果需要指定保留的列,可以取消注释代码中的列筛选部分,替换为你的目标列名。
- 添加空列表判断:防止没有找到Excel文件时出现错误。
内容的提问来源于stack exchange,提问作者Edoardo Pierezza
相关产品推荐
相关产品推荐

