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

如何高效关联含多邮箱字段的两个Pandas DataFrame以匹配测试客户?

解决方案:用长格式拆分+内连接简化邮箱匹配

我明白你之前拆分多列再merge的流程有多繁琐——其实我们可以用将邮箱列拆分为长格式行的方式,轻松实现两个DataFrame的邮箱匹配,不管每行有多少个邮箱都能统一处理,代码简洁很多。

具体步骤与代码示例

首先先还原你的示例数据(方便测试):

import pandas as pd

df1 = pd.DataFrame({
    'myid': [1001, 1002, 1003, 1004, 1005],
    'emails': [
        'pikachu@icloud.com;charizard@gmail.com',
        'bulbasaur@gmail.com',
        'meowth@gmail.com;james@yahoo.com;jesse@yahoo.com;wobbuffet@yahoo.com',
        'abra@gmail.com;ash@yahoo.com',
        'squirtle@gmail.com'
    ],
    'price': [1, 2, 8, 7, 9]
})

df2 = pd.DataFrame({
    'tr_id': [101, 102, 103, 104, 105],
    'latest_em': [
        'pichu@icloud.com; paul@gmail.com',
        'ash@yahoo.com',
        'squirtle@gmail.com',
        'charmander@gmail.com',
        'ash@yahoo.com;misty@yahoo.com'
    ],
    'test': [12, 13, 16, 18, 10]
})

接下来是核心处理逻辑:

  1. 将邮箱列拆分为长格式:把每个分号分隔的邮箱字符串转成列表,再展开成单独的行,同时保留原行的其他信息
  2. 基于单个邮箱做内连接:找到所有存在匹配关系的邮箱对
  3. 合并回原数据的完整信息:把原DataFrame的完整邮箱字符串和其他字段合并回来,得到最终结果
# 处理df1:拆分邮箱为单独行,同时去除邮箱可能带的空格
df1_long = df1.assign(
    email=df1['emails'].str.split(';').apply(lambda lst: [s.strip() for s in lst])
).explode('email').reset_index(drop=True)

# 处理df2:同样拆分邮箱为单独行,去除空格
df2_long = df2.assign(
    email=df2['latest_em'].str.split(';').apply(lambda lst: [s.strip() for s in lst])
).explode('email').reset_index(drop=True)

# 基于邮箱做内连接,找到所有匹配的记录
matched = pd.merge(df1_long, df2_long, on='email', how='inner')

# 合并回原df1和df2的完整信息,得到最终结果
final_result = pd.merge(matched, df1[['myid', 'emails', 'price']], on='myid') \
               .merge(df2[['tr_id', 'latest_em', 'test']], on='tr_id')

# 筛选需要的列并去重(避免同一匹配关系重复出现)
final_result = final_result[['myid', 'emails', 'price', 'tr_id', 'latest_em', 'test']].drop_duplicates()

print(final_result)

运行结果

这段代码会输出你预期的结果:

myid                          emails  price  tr_id                        latest_em  test
0  1004        abra@gmail.com;ash@yahoo.com      7    102                    ash@yahoo.com    13
1  1004        abra@gmail.com;ash@yahoo.com      7    105        ash@yahoo.com;misty@yahoo.com    10
2  1005              squirtle@gmail.com      9    103              squirtle@gmail.com    16

为什么这个方法更好?

  • 不管每行有多少个邮箱(1个、2个甚至N个),都不需要手动处理多列的情况,代码扩展性极强
  • 自动处理邮箱中可能存在的空格问题(比如df2里的paul@gmail.com前面有空格),避免匹配失败
  • 逻辑清晰,相比拆分多列再merge的方式,代码量更少,可读性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:24:12