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

如何在PySpark中基于另一DataFrame列替换指定邮箱?

解决方案:用df2匹配邮箱替换df1对应行,保留df1原有数据

你的需求核心是:以Name和Surname为匹配键,用df2中的邮箱替换df1里同名同姓行的邮箱,同时保留df1中未在df2出现的所有行。下面给两种简洁的实现方式:

方法一:使用merge合并后填充(直观易理解)

这种方法先将两个DataFrame按姓名合并,再优先取df2的邮箱,没有匹配到的就用df1原邮箱:

import pandas as pd

# 构造示例数据(对应你的df1和df2)
df1 = pd.DataFrame({
    'Name': ['John', 'Jake', 'Anna', 'Kale', 'George', 'Patrick'],
    'Surname': ['Smith', 'Smith', 'Hendrix', 'Kinderstone', 'Hiddleston', 'Huston'],
    'email': ['JohnSmith@gmail.com', 'JakeSmith@gmail.com', 'Anna1994@protonmail.com', 
              'Kinder@hotmail.com', 'GH@tonmail.com', 'Huston1990@yahoomail.com']
})

df2 = pd.DataFrame({
    'Name': ['John', 'Hannah', 'Anna', 'Kale', 'Ivan', 'Florence'],
    'Surname': ['Smith', 'Montana', 'Hendrix', 'Kinderstone', 'Gaganovitch', 'Jekins'],
    'email': ['JSmith@ymail.com', 'HMontana@ymail.com', 'AHendrix@ymail.com', 
              'KKinderstone@ymail.com', 'IG@ymail.com', 'FJekins@ymail.com']
})

# 1. 按姓名左连接,保留df1所有行,同时带上df2的邮箱
merged_df = df1.merge(df2[['Name', 'Surname', 'email']], 
                      on=['Name', 'Surname'], 
                      how='left', 
                      suffixes=('_df1', '_df2'))

# 2. 优先用df2的邮箱,没有匹配到则用df1原邮箱
merged_df['email'] = merged_df['email_df2'].fillna(merged_df['email_df1'])

# 3. 清理多余列,得到最终df3
df3 = merged_df.drop(columns=['email_df1', 'email_df2'])
print(df3)

方法二:使用set_index + update(更高效)

这种方法通过设置索引对齐,直接更新匹配行的邮箱,代码更简洁:

# 复制df1作为基础(避免修改原df1)
df3 = df1.copy()

# 将df2设置为姓名索引,只保留邮箱列,然后更新df3
df3.set_index(['Name', 'Surname'], inplace=True)
df3.update(df2.set_index(['Name', 'Surname'])['email'])

# 重置索引恢复原结构
df3.reset_index(inplace=True)
print(df3)

两种方法最终都会得到你想要的df3,其中:

  • 方法一适合需要查看中间过程、调试的场景;
  • 方法二更高效,适合处理大数据量的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:40