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

如何在Pandas DataFrame中通过匹配邮箱前缀与格式化后的姓名查找目标行

如何在Pandas DataFrame中通过匹配邮箱前缀与格式化后的姓名查找目标行

嘿,我完全懂你遇到的问题——直接用str.contains搭配Series确实行不通,因为它是拿整个Series去匹配每个邮箱元素,而不是咱们需要的逐行对应比较。别担心,换个思路就搞定了,给你两种靠谱的方法:

方法一:向量式处理(效率更高,推荐大数据集)

咱们分别对两列做格式化处理,然后直接逐行比较是否相等,用这个布尔结果来筛选行就行:

import pandas as pd

# 先还原你的测试数据
data = {
    'Email': ['john.cena@gmail.com', 'john.smith@gmail.com'],
    'Name': ['John Cena', 'John Cena']
}
df = pd.DataFrame(data)

# 1. 处理姓名列:转小写,把空格换成点
formatted_name = df['Name'].str.lower().str.replace(' ', '.')
# 2. 提取邮箱的前缀部分(@之前的内容)
email_prefix = df['Email'].str.split('@').str[0]
# 3. 构造匹配条件,筛选符合的行
matched_rows = df.loc[email_prefix == formatted_name]

print(matched_rows)

运行后你会看到只有第一行john.cena@gmail.com对应的记录被筛选出来,这正是你要的结果。

方法二:逐行apply处理(可读性强,适合小数据集)

如果觉得向量式的处理有点绕,也可以用apply逐行判断,逻辑和你写的条件完全一致:

matched_rows = df[df.apply(
    lambda row: row['Email'].split('@')[0] == row['Name'].lower().replace(' ', '.'),
    axis=1  # axis=1表示按行处理
)]

这个方法的逻辑更直观,每一行都会执行你设定的匹配规则,返回True/False,最后用这个布尔序列过滤DataFrame。

为啥你之前的方法不行?

你之前用dataframe["Email"].str.contains(dataframe["Name"].replace(" ", ".")),问题出在str.contains接受的是一个字符串(或正则),而你传了一个Series,它会把整个Series当成要匹配的模式,这显然不是逐行对应的逻辑,所以才会出错。

备注:内容来源于stack exchange,提问作者badbadllama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:03:09