如何根据另一DataFrame列的匹配关系更新PySpark DataFrame列?
用df1的值更新df2的Col2列的解决方案
没问题,这其实就是个典型的按匹配键映射值的需求,用Pandas可以轻松实现,我给你两种常用的方法,你可以根据自己的场景选择:
首先先把你给出的示例数据用代码还原出来,方便测试:
import pandas as pd # 构造df1 df1 = pd.DataFrame({ 'Col1': ['A', 'B', 'C'], 'Col2': [1, 2, 3] }) # 构造df2 df2 = pd.DataFrame({ 'Col1': ['A', 'B', 'B'], 'Col2': ['-', '-', '-'] })
方法1:用字典映射(最简洁高效)
先从df1生成一个Col1到Col2的映射字典,再用map()函数直接替换df2的Col2列:
# 创建Col1到Col2的映射字典 col_mapping = df1.set_index('Col1')['Col2'].to_dict() # 更新df2的Col2 df2['Col2'] = df2['Col1'].map(col_mapping)
执行后df2的结果就是:
| Col1 | Col2 |
|---|---|
| A | 1 |
| B | 2 |
| B | 2 |
这种方法速度快,代码简洁,适合只需要替换单列的场景。如果df2里存在df1没有的Col1值,映射后会变成NaN,你可以用fillna()保留原有的'-':
df2['Col2'] = df2['Col1'].map(col_mapping).fillna('-')
方法2:用merge合并(适合多列同步更新)
如果后续需要同步更多列的数据,用merge()左连接会更灵活:
# 左连接df2和df1,只保留需要的列 df2 = df2.merge(df1[['Col1', 'Col2']], on='Col1', how='left', suffixes=('', '_from_df1')) # 替换原Col2列,然后删除临时列 df2['Col2'] = df2['Col2_from_df1'] df2.drop(columns='Col2_from_df1', inplace=True)
这种方法的好处是可以一次性同步多个关联列,而且能保证df2的所有行都被保留(左连接特性)。
内容的提问来源于stack exchange,提问作者jartymcfly
相关产品推荐
相关产品推荐

