如何用Pandas删除CSV间重复项,保留EF文件独有的用户
筛选EF文件中不在UL文件里的用户
你的需求是保留EF(符合福利计划用户)中EmployeeId不存在于UL(系统当前用户)里的记录,原代码存在逻辑错误和效率问题,下面是修正后的实现方案:
原代码问题点
- 冗余的
pd.concat操作:你不需要合并两个文件,这个步骤完全没必要 - 循环遍历+错误的删除逻辑:
df_ef.drop(df["EmployeeId"])参数错误,且循环遍历DataFrame是pandas中低效的做法 - 成员判断错误:
i in df_ul["EmployeeId"]实际是检查索引而非值,应该用矢量化的isin方法
高效实现方案
方案一:使用isin矢量化筛选
这是最简洁高效的方式,直接过滤出目标行:
import pandas as pd def get_ef_exclusive_users(ef_path, ul_path): # 读取数据 df_ef = pd.read_csv(ef_path) df_ul = pd.read_csv(ul_path) # 提取UL的EmployeeId并转为集合(提升查询速度) ul_ids = set(df_ul["EmployeeId"]) # 筛选EF中不在UL的记录 result = df_ef[~df_ef["EmployeeId"].isin(ul_ids)] # 输出并保存结果 print(result) result.to_csv("finalized.csv", index=False) # 调用函数 ef_file = "Test_Ready_EF.csv" ul_file = "Test_Ready_UL.csv" get_ef_exclusive_users(ef_file, ul_file)
方案二:使用merge实现左反连接
如果你习惯数据库的连接逻辑,可以用左反连接来实现,通过merge的indicator参数标识匹配状态:
import pandas as pd def get_ef_exclusive_users(ef_path, ul_path): df_ef = pd.read_csv(ef_path) df_ul = pd.read_csv(ul_path) # 仅保留UL的EmployeeId列(减少连接开销),做左连接并添加匹配标识 merged_df = df_ef.merge( df_ul[["EmployeeId"]], on="EmployeeId", how="left", indicator=True ) # 筛选仅存在于EF中的记录,去掉标识列 result = merged_df[merged_df["_merge"] == "left_only"].drop(columns="_merge") print(result) result.to_csv("finalized.csv", index=False) # 调用函数 ef_file = "Test_Ready_EF.csv" ul_file = "Test_Ready_UL.csv" get_ef_exclusive_users(ef_file, ul_file)
关键提示
- 用
set存储UL的EmployeeId:当数据量较大时,集合的成员查询速度远快于Series - 优先使用矢量化操作:pandas的矢量化方法(如
isin、merge)比循环遍历高效几个数量级 - 两种方案效果一致:可根据自己的习惯选择,方案一更适合快速实现,方案二更适合理解数据匹配逻辑
内容的提问来源于stack exchange,提问作者Pongotan
相关产品推荐
相关产品推荐

