Python如何标记Excel所有重复行为True并为对应行填充背景色
解决方案
你现有代码的核心问题有两个:一是调用duplicated()时默认使用keep='first'规则,仅标记每组重复项中除首次出现外的行;二是你写的重复判断结果被包裹在列表中,没有实际赋值给DataFrame字段,也没有对接样式写入逻辑。
Q1 所有重复行标记为True的实现
直接在调用duplicated()时传入keep=False参数,即可将所有存在重复的行(包含每组重复项首次出现的行)全部标记为True,核心代码:
import pandas as pd dt = pd.read_excel('C:/Users/Desktop/Student.xlsx') # subset指定判断重复的列,keep=False标记所有重复项 dt['Duplicate'] = dt.duplicated(subset=['Name', 'Reg Date'], keep=False)
执行后所有重复的Annie、David行的Duplicate字段都会返回True,无重复的行返回False,符合你的预期。
Q2 重复行填充背景色并保存文件
pandas不支持直接写入单元格样式,需要搭配openpyxl操作Excel文件实现,注意先写入数据再加载做样式修改,避免样式被覆盖,完整代码如下:
import pandas as pd from openpyxl import load_workbook from openpyxl.styles import PatternFill # 配置文件路径 file_path = 'C:/Users/Desktop/Student.xlsx' # 1. 完成重复行标记 dt = pd.read_excel(file_path) dt['Duplicate'] = dt.duplicated(subset=['Name', 'Reg Date'], keep=False) # 将带标记的数据写回文件,不保留pandas索引 dt.to_excel(file_path, index=False) # 2. 加载文件写入样式 wb = load_workbook(file_path) ws = wb.active # 定义背景填充样式,此处为浅黄色,可替换为任意十六进制色值 fill_style = PatternFill(start_color='FFFF99', end_color='FFFF99', fill_type='solid') # 遍历数据行(第1行是表头,从第2行开始处理;Duplicate字段在第3列) for row_idx in range(2, ws.max_row + 1): # 判断当前行是否为重复行 is_duplicate = ws.cell(row=row_idx, column=3).value if is_duplicate: # 遍历当前行所有单元格,填充背景色 for col_idx in range(1, ws.max_column + 1): ws.cell(row=row_idx, column=col_idx).fill = fill_style # 如果你不需要保留Duplicate列,取消下一行注释即可 # ws.delete_cols(3) # 保存最终修改 wb.save(file_path)
补充说明
- 背景色可通过修改
start_color和end_color的十六进制值自定义,比如浅红色为FFC7CE、浅绿色为C6EFCE。 - 如果需要调整判断重复的列,直接修改
subset参数传入的列名列表即可。
内容的提问来源于stack exchange,提问作者CHL
相关产品推荐
相关产品推荐

