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

