如何在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
相关产品推荐
相关产品推荐

