Python合并Excel同名多行数据至一行,求高效库及实现方案
解决方案:合并Excel中同名数据至单行
嘿,针对你要把同一名称(比如Smith)的分散数据合并到同一行的需求,我来给你梳理下最优方案:
一、库的选择建议
你目前纠结的库选择问题,答案很明确:优先用pandas,而不是openpyxl。原因如下:
openpyxl更适合做单元格级的精细操作(比如设置格式、插入图表),但处理数据聚合、合并这类需求会非常繁琐,需要自己写大量循环逻辑;pandas是Python专门用于数据处理的库,内置了groupby(分组)、agg(聚合)这类工具,能几行代码搞定你要的合并需求,效率和可读性都高很多。
你的初步思路(循环遍历写入新表、用JSON存字典列表)其实都可以被pandas的内置方法替代,不用自己造轮子。
二、具体实现步骤&代码示例
下面是直接可用的代码,完全覆盖你的需求,我会加详细注释:
import pandas as pd import os # 定义文件路径 path = "C:\\My files\\Staff\\Project\\ProjektExcelPython\\test_files\\" input_file = os.path.join(path, "PlikExcelDoKonwersji.xlsx") output_file = os.path.join(path, "合并后的文件.xlsx") # 读取Excel文件,注意你之前设置了header=1,说明表头在第2行(索引从0开始) df = pd.read_excel(input_file, engine='openpyxl', header=1) # 关键步骤:按名称列分组,聚合所有需要的信息 # 这里假设你的名称列叫"姓名",你需要把它改成你实际的列名 # agg方法里的键是你要保留的列名,值是聚合方式: # - 对于文本类信息(比如产品名称),用lambda x: ', '.join(x.unique()) 去重合并 # - 对于数值类信息(比如数量、金额),可以用sum、mean等 merged_df = df.groupby("姓名", as_index=False).agg( { "产品名称": lambda x: ', '.join(x.unique()), # 合并所有唯一的产品名称 "产品数量": "sum", # 求和所有产品数量 "产品价格": "mean" # 计算平均价格(根据你的需求调整) } ) # 将合并后的数据保存到新Excel文件 merged_df.to_excel(output_file, engine='openpyxl', index=False) print("合并完成!新文件已保存至:", output_file)
三、关键细节说明
- 列名替换:一定要把代码中的
"姓名"、"产品名称"等列名改成你Excel里实际的列名; - 聚合方式调整:如果某列需要其他聚合逻辑(比如保留最新的一条数据),可以把
lambda函数换成last()(需要先按时间排序); - 处理空值:如果你的数据有空值,可以在读取后加
df = df.fillna("")把空值替换成空字符串,避免合并时出现异常; - 如果必须用openpyxl:如果因为某些原因只能用openpyxl,那确实需要遍历行、用字典存储同名数据,再写入新表,但这种方法代码量会大很多,不如pandas高效。
内容的提问来源于stack exchange,提问作者QmanW




