sql - 通过加入具有不同行数和多列的数据框来填充空值
问题描述
我试图搜索,但虽然我遇到了类似的情况,但我没有找到我要找的东西。
我有以下两个数据框:
+---------------------------+
| ID| Value| type |
+---------------------------+
| user0| 100 | Car |
| user1| 102 | Car |
| user2| 109 | Dog |
| user3| 103 | NA |
| user4| 110 | Dog |
| user5| null | null |
| user6| null | null |
| user7| null | null |
+---------------------------+
+---------------------------+
| ID2| Value2| type2|
+---------------------------+
| user5| 115 | Cell |
| user6| 103 | Cell |
| user7| 100 | Fridge|
+---------------------------+
我想加入这两个,结果如下:
+---------------------------+
| ID| Value| type |
+---------------------------+
| user0| 100 | Car |
| user1| 102 | Car |
| user2| 109 | Dog |
| user3| 103 | NA |
| user4| 110 | Dog |
| user5| 115 | Cell |
| user6| 103 | Cell |
| user7| 100 | Fridge |
+---------------------------+
我尝试了以下方法,但没有返回预期的结果:
df_joined= df1.join(df2,(df1.id==df2.id2) &
(df1.value==df2.value2) &
(df1.type==df2.type2),
"left").drop('id2','value2','type2')
我只从第一个 df 中获取值,可能 left 不是正确的连接类型,但我不明白应该使用什么。
解决方案
您只需要使用 ID 加入,而不是其他列,因为其他列不一样。要组合其他列,请使用coalesce
,它给出第一个非空值。
import pyspark.sql.functions as F
df_joined = df1.join(df2, df1.ID == df2.ID2, 'left').select(
'ID',
F.coalesce(df1.Value, df2.Value2).alias('Value'),
F.coalesce(df1.type, df2.type2).alias('type')
)
df_joined.show()
+-----+-----+------+
| ID|Value| type|
+-----+-----+------+
|user0| 100| Car|
|user1| 102| Car|
|user2| 109| Dog|
|user3| 103| NA|
|user4| 110| Dog|
|user5| 115| Cell|
|user6| 103| Cell|
|user7| 100|Fridge|
+-----+-----+------+
推荐阅读
- kivy - kivy recycleview gridlayout如何显示单行
- pycharm - 我安装了pycharm,它甚至无法启动并显示启动错误我尝试重新安装它但没有任何效果
- javascript - 如何查找对象的所有属性的总和并将其保存为同一对象中的另一个属性
- python - pyautocad中是否有“创建块”命令?
- swift - 使用新 Xcode 13 归档时出现 Core Data 错误
- elrond - Mandos:部署智能合约时智能合约无效
- angular - Kendo 网格禁用 editRow 事件
- html - 用户退出时清除对受保护站点的访问
- python - 在线性回归截距中出现负值?
- c - 是否可以使用 LD_PRELOAD 在挂钩中使用回溯?