Pandas中.merge()合并后new_users数据框为空的问题排查
解决Merge后new_users数据框为空的问题
问题根源分析
你的代码核心问题是UniqueID标准化的时机错误:
- 原逻辑先合并
ef_in和ul_in并去重,再对ID补零处理,导致去重时用的是原始非标准化ID,后续补零后df中的ID和ef_in/ul_in的ID无法匹配,最终merge返回空框。 - 对比可用代码,另一家客户的ID本身是标准化格式,不需要补零,所以直接去重后merge能正常匹配,但当前客户的ID需要补零,顺序颠倒就出问题了。
- 额外问题:
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
相关产品推荐
相关产品推荐

