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

使用Pandas merge合并Excel表时出现列/数据缺失问题求助

问题描述

我有两个Excel文件,分别存储用户详情表(Table 1)和员工详情表(Table 2),两张表均包含Email Address列。我希望通过pd.merge方法,以Email Address为关联键,生成包含在职员工用户详情的新表,因此采用左连接方式合并两个DataFrame。

我尝试了以下3段merge代码:

import pandas as pd

df_user = pd.read_excel('file1.xlsx')
df_emp = pd.read_excel('file2.xlsx')

df_new = df_user.merge(df_emp, how='left')
#df_new = pd.merge(df_user, df_emp, how='left')
#df_new = pd.merge(df_user, df_emp, on='Email Address', how='left')

df_new.to_excel('output.xlsx', index=False)

但所有代码都未返回完整数据,生成的新表仅包含Table 1的数据和Table 2的表头,且Table 2部分的Email Address列缺失,仅Table 1部分显示该列。我的期望是生成以Email Address为匹配键,包含Table 1数据及Table 2匹配数据的新表,请问哪里操作有误?

问题分析与解决

出现这个问题的核心原因是两张表的Email Address列数据没有匹配上,或者列名存在隐性差异,导致左连接后Table 2的所有匹配数据都为空。按以下步骤排查修复:

1. 确认列名是否完全一致

有时候Excel里的列名看起来是Email Address,但读取到pandas后可能带有多余空格(开头/末尾)、全角字符,或者被自动转换格式(比如下划线替代空格)。先打印两个表的列名确认:

print("用户表列名:", df_user.columns.tolist())
print("员工表列名:", df_emp.columns.tolist())

如果列名不一致,比如员工表的列名是Email Address (末尾多空格),需要统一列名:

# 把员工表的列名改成和用户表一致
df_emp.rename(columns={'Email Address ': 'Email Address'}, inplace=True)

2. 统一邮箱数据格式,检查匹配度

pandas的merge是严格匹配的,哪怕邮箱大小写不同(比如abc@xxx.com和ABC@XXX.COM)、带多余空格,都会被视为不同值。先统一处理邮箱格式:

# 去除前后空格,统一转为小写
df_user['Email Address'] = df_user['Email Address'].str.strip().str.lower()
df_emp['Email Address'] = df_emp['Email Address'].str.strip().str.lower()

然后检查两个表的共同邮箱数量,确认是否有匹配项:

common_emails = set(df_user['Email Address'].dropna()) & set(df_emp['Email Address'].dropna())
print("两个表的共同邮箱数量:", len(common_emails))

如果数量为0,说明原始数据里确实没有重合的邮箱,需要检查数据源是否正确;如果有数量,就可以继续合并。

3. 规范merge代码

必须明确指定on='Email Address',避免pandas自动匹配时出错,最终代码参考:

import pandas as pd

df_user = pd.read_excel('file1.xlsx')
df_emp = pd.read_excel('file2.xlsx')

# 统一邮箱格式
df_user['Email Address'] = df_user['Email Address'].str.strip().str.lower()
df_emp['Email Address'] = df_emp['Email Address'].str.strip().str.lower()

# 左连接合并
df_new = pd.merge(df_user, df_emp, on='Email Address', how='left')

df_new.to_excel('output.xlsx', index=False)

4. 验证合并结果

合并后可以打印各列的非空值数量,确认Table 2的列是否有匹配到数据:

print(df_new.count())

内容的提问来源于stack exchange,提问作者LeonH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:00:59