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

Pandas中.merge()合并后new_users数据框为空的问题排查

解决Merge后new_users数据框为空的问题

问题根源分析

你的代码核心问题是UniqueID标准化的时机错误:

  1. 原逻辑先合并ef_in和ul_in并去重,再对ID补零处理,导致去重时用的是原始非标准化ID,后续补零后df中的ID和ef_in/ul_in的ID无法匹配,最终merge返回空框。
  2. 对比可用代码,另一家客户的ID本身是标准化格式,不需要补零,所以直接去重后merge能正常匹配,但当前客户的ID需要补零,顺序颠倒就出问题了。
  3. 额外问题:str.contains("Clarks", "test")写法错误,第二个参数会被识别为case参数(布尔值),实际无法过滤包含"test"的内容。

修复后的完整代码

def client_merge(ef_in, ul_in):
    pd.set_option('mode.chained_assignment', None)

    # 前置处理:先统一数据类型,同时将UniqueID标准化为10位(核心修复)
    ef_in['UniqueID'] = ef_in['UniqueID'].astype(object).str.rjust(10, "0")
    ef_in['HireDate'] = ef_in['HireDate'].astype(object)
    ef_in['DateOfBirth'] = ef_in['DateOfBirth'].astype(object)
    
    ul_in['UniqueID'] = ul_in['UniqueID'].astype(object).str.rjust(10, "0")
    ul_in['Action'] = ul_in['Action'].astype(object)
    ul_in['ZipCode'] = ul_in['ZipCode'].astype(object)

    # 基于标准化后的ID执行合并去重
    df = pd.concat([ef_in, ul_in], axis=0, ignore_index=True, sort=False)
    df.drop_duplicates(subset=["UniqueID"], keep=False, inplace=True)

    # 此时三方ID完全匹配,merge可正常获取数据
    new_users = df.merge(ef_in)
    disable_users = df.merge(ul_in)

    disable_users['Action'].fillna('Disable', inplace=True)
    ready_to_print_file = pd.concat([new_users, disable_users], ignore_index=False)

    # 修正过滤逻辑:用~取反,|表示多关键词匹配
    rtpf1 = ready_to_print_file[~ready_to_print_file["FirstName"].str.contains("companytest")]
    rtpf2 = rtpf1[~rtpf1["FirstName"].str.contains("Clarks|test")]

    rtpf2.to_csv(path, header=True, index=False)

验证建议

  • 执行时可添加打印语句,确认df['UniqueID']、ef_in['UniqueID']的格式完全一致,比如:
    print("df的UniqueID样本:", df['UniqueID'].head())
    print("ef_in的UniqueID样本:", ef_in['UniqueID'].head())
    
  • 确认ef_in和ul_in中存在仅在单一文件出现的UniqueID,这是new_users有数据的前提(如果所有ID都重复,去重后df为空,自然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.06 15:35:15