【发布时间】:2020-07-31 03:17:09
【问题描述】:
我有两个数据框:
DF1:
╔═══════╦═════╦═════════╦════╗
║ Name ║ Age ║ Address ║ Id ║
╠═══════╬═════╬═════════╬════╣
║ test1 ║ 20 ║ ls ║ 10 ║
╠═══════╬═════╬═════════╬════╣
║ test2 ║ ║ baz ║ 15 ║
╠═══════╬═════╬═════════╬════╣
║ test3 ║ ║ az ║ 19 ║
╚═══════╩═════╩═════════╩════╝
DF2:
╔═══════╦═════╦═════════╦════╗
║ Name ║ Age ║ Address ║ Id ║
╠═══════╬═════╬═════════╬════╣
║ test4 ║ 20 ║ bas ║ 10 ║
╠═══════╬═════╬═════════╬════╣
║ test5 ║ ║ baz ║ 25 ║
╠═══════╬═════╬═════════╬════╣
║ test6 ║ 40 ║ az ║ 19 ║
╚═══════╩═════╩═════════╩════╝
结果:
╔═══════╦═════╦═════════╦════╗
║ Name ║ Age ║ Address ║ Id ║
╠═══════╬═════╬═════════╬════╣
║ test1 ║ 20 ║ ls ║ 10 ║
╠═══════╬═════╬═════════╬════╣
║ test2 ║ 40 ║ az ║ 19 ║
╚═══════╩═════╩═════════╩════╝
我想要达到的目标: 1.当 Id 在两个帧中都匹配时,它应该只考虑输出中的那个记录。 2. 该匹配记录的所有列应替换为 DF1 列。 3. 如果 DF1 列为空且 DF2 中存在数据,则不应替换它。
也尝试过加入:
DF3 = DF1.join(DF2, [DF1.Id == DF2.Id], 'inner')
DF3.show()
结果:
Name,Age,Adress,Id,Name,Age,Adress,Id
test1,20,ls,10,test5,20,bas,10
如果我使用
DF3 = DF1.join(DF2, [DF1.Id == DF2.Id], 'leftsemi')
DF3.show()
它为我提供来自 DF1 的数据,并且不添加来自 D2 的缺失值。
尝试实现以下目标:
for i in df2.columns:
df2 = df2.withColumn(i, when(df1.Id == col("Id") & (col(i) == ""), df1(i)).otherwise(col(i)))
df2.show()
【问题讨论】:
标签: python apache-spark pyspark apache-spark-sql pyspark-sql