使用Python Pandas合并Excel文件后按多条件删除指定行的实现方法
实现逻辑说明
我们以除Status、File外的所有字段作为同一业务实体的唯一标识,按该标识分组后分别匹配过滤规则即可:
- 对于仅出现在单个文件的实体,直接删除「来源为file1.xlsx且Status为Fixed」的行,其余单实体行保留
- 对于两个文件都存在的实体,仅保留「file1对应行Status为Active、file2对应行Status为Fixed」的成对行,其余多实体组全部删除
完整实现代码
import pandas as pd # 原有合并逻辑 df1 = pd.read_excel('file1.xlsx') df2 = pd.read_excel('file2.xlsx') file1 = "file1.xlsx" file2 = "file2.xlsx" df1 = df1.sort_values('ID') df1["File"] = file1 df2 = df2.sort_values('ID') df2["File"] = file2 dfs = [df1, df2] df_diff = pd.concat(dfs).drop_duplicates(keep=False, subset=['IP', 'Name', 'Comments', 'ID', 'Title', 'Status']) # 新增过滤逻辑 # 定义同一业务实体的判断基准字段 group_keys = ['ID', 'IP', 'Name', 'Comments', 'OS', 'Title'] valid_rows = [] for _, group in df_diff.groupby(group_keys): group_len = len(group) # 处理成对出现的实体 if group_len == 2: status_file_map = dict(zip(group['File'], group['Status'])) # 匹配规则2:file1为Active,file2为Fixed if status_file_map.get(file1) == 'Active' and status_file_map.get(file2) == 'Fixed': valid_rows.append(group) # 处理仅出现在单个文件的实体 elif group_len == 1: row = group.iloc[0] # 匹配规则1:排除仅来自file1且Status为Fixed的行 if not (row['File'] == file1 and row['Status'] == 'Fixed'): valid_rows.append(group) # 合并筛选结果并导出 df_result = pd.concat(valid_rows).reset_index(drop=True) df_result.to_excel(r'file3.xlsx', index=False)
注意事项
- 注意
Status字段的取值大小写需和实际数据一致,若实际数据为小写fixed/active需对应修改代码中的判断值 - 若存在同一业务实体对应超过2行的异常数据,默认会直接排除,可根据实际需求调整分组后的处理逻辑
内容的提问来源于stack exchange,提问作者vale.maio2
相关产品推荐
相关产品推荐

