You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:01:12