楼主: xinyinian
1189 1

[问答] 使用Python将多个excel表格根据特定条件将表格合并 [推广有奖]

  • 0关注
  • 0粉丝

本科生

40%

还不是VIP/贵宾

-

威望
0
论坛币
2 个
通用积分
1.6116
学术水平
5 点
热心指数
0 点
信用等级
0 点
经验
525 点
帖子
23
精华
0
在线时间
114 小时
注册时间
2018-12-28
最后登录
2023-10-27

楼主
xinyinian 发表于 2023-7-8 12:01:05 |AI写论文
1论坛币
各位大神,本人在用Python对多个excel文件合并时,遇到个问题需要将特定条件下的excel合并。条件是第三行“”相同,如果不同就另外输出一个excel。

关键词:excel表格 Excel表 python EXCEL xcel

沙发
george_dong817 发表于 2025-1-22 07:48:06
遍历指定文件夹中的所有 Excel 文件,读取它们的内容。
获取每个 Excel 文件第三行的唯一标识。
如果“第三行”判断只是看整行是否完全相同,可以把这一整行的内容当作一个“key”;
如果只看第三行某个单元格(例如第三行第一列的值),就把那个单元格作为“key”。
建立一个 字典 (dict),使用上面得到的第三行内容作为字典的键(key),对应一个装载该类 Excel 内容的列表。
根据字典键分组,将相同 key 的数据合并,最后输出到对应的 Excel 文件中。
下面我们使用 Pandas 库来做一个示例。如果你需要基于 openpyxl 或其他库进行读写,也可做相应的修改。

  1. import os
  2. import pandas as pd

  3. def merge_excels_by_third_row(folder_path, output_prefix="merged"):
  4.     """
  5.     从指定文件夹中,读取多个 Excel 文件,
  6.     按第三行的值进行分类并合并,
  7.     最终输出若干个合并后的 Excel 文件。

  8.     :param folder_path: 存储 Excel 文件的文件夹路径
  9.     :param output_prefix: 输出文件的前缀名称
  10.     """
  11.     # 1. 找到所有 Excel 文件
  12.     excel_files = [f for f in os.listdir(folder_path)
  13.                    if f.endswith('.xlsx') or f.endswith('.xls')]

  14.     # 用于存放分组后的 DataFrame 列表
  15.     grouped_data = {}

  16.     for file_name in excel_files:
  17.         file_path = os.path.join(folder_path, file_name)
  18.         # 2. 读取该 Excel 文件(只读取第一张表为示例,header=None 表示不使用任何行为表头)
  19.         df = pd.read_excel(file_path, sheet_name=0, header=None)

  20.         # 3. 获取第三行内容作为分组标识
  21.         #    假设仅根据第三行第一列进行分组
  22.         #    如果要基于整行来分组,也可以将整行转换成元组或字符串
  23.         third_row_value = df.iloc[2, 0]  # 第三行(索引2),第一列(索引0)

  24.         # 如果要把第三行整体作为key:
  25.         # third_row_tuple = tuple(df.iloc[2, :].astype(str).tolist())

  26.         # 4. 放入分组
  27.         if third_row_value not in grouped_data:
  28.             grouped_data[third_row_value] = []
  29.         grouped_data[third_row_value].append(df)

  30.     # 5. 对相同 key 下的数据进行合并,并写回到 Excel
  31.     #    这里采用行方向简单拼接 (pd.concat),忽略原来的行索引
  32.     for key, dfs in grouped_data.items():
  33.         # 将所有 DF 拼成一个
  34.         combined_df = pd.concat(dfs, ignore_index=True)
  35.         # 生成输出文件名,比如 merged_第三行值.xlsx
  36.         output_file_name = f"{output_prefix}_{key}.xlsx"
  37.         output_file_path = os.path.join(folder_path, output_file_name)
  38.         combined_df.to_excel(output_file_path, index=False, header=False)
  39.         print(f"已输出文件:{output_file_path}")


  40. if __name__ == "__main__":
  41.     # 替换成自己存放 Excel 文件的路径
  42.     folder_path = r"D:\temp\excel_folder"
  43.     merge_excels_by_third_row(folder_path)
复制代码


说明
header=None

当我们不确定 Excel 的第一行是否适合作为字段名时,可以先全部读进来;这样 Pandas 默认会给列加上数值索引(0,1,2...)。
如果你的 Excel 文件有表头,你可以根据需求调整 header 参数的值,或者在后续对 DataFrame 进行处理、重新设置表头。
df.iloc[2, 0]

iloc[2, 0] 表示读取第三行(索引2)、第一列(索引0)的值。
如果想对第三行所有列进行对比,可以使用 df.iloc[2, :] 获取整行数据,并将它转为元组或字符串用作分组键。
grouped_data 字典

字典的键(key)就是第三行的内容,值(value)是一个列表,列表里存放相同键对应的多个 DataFrame。
合并操作

这里使用 pd.concat(dfs, ignore_index=True) 对同一个键下的 DataFrame 进行 行方向的拼接(即把一个表紧接在另一个表的后面)。如果你的需求是想做列拼接或更复杂的合并方式,可以参考 pandas.merge 或设置 axis 参数等。
输出文件命名

输出文件名中加入了第三行内容作为标识。
如果第三行的内容存在特殊字符或者过长,不适合做文件名,你可以做一些格式化处理,比如去掉特殊字符或者只取前面一部分作为文件名后缀等。
这样就可以实现:当多个 Excel 文件第三行内容相同时合并到一个新文件;如果第三行内容不一致,则自动分到不同的输出文件。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 07:11