У меня есть два фрейма данных:
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. Когда идентификатор совпадает в обоих кадрах, он должен учитывать только эту запись в выводе. 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()