python - PySpark 数据帧 : Full Outer Join with a condition

标签 python python-3.x dataframe pyspark

我有以下 2 个数据框-

dataframe_a
+----------------+---------------+
|         user_id|         domain|
+----------------+---------------+
|            josh|     wanadoo.fr|
|        samantha|     randomn.fr|
|             bob|    eidsiva.net|
|           dylan|    vodafone.it|
+----------------+---------------+

dataframe_b
+----------------+---------------+
|         user_id|         domain|
+----------------+---------------+
|            josh|  oldwebsite.fr|
|        samantha|     randomn.fr|
|           dylan|      oldweb.it|
|            ryan|      chicks.it|
+----------------+---------------+

我想做一个完整的外部联接,但保留 dataframe_adomain 列中的值,以防我为单个 user_id 获得 2 个不同的域。所以,我想要的数据框看起来像-

desired_df
+----------------+---------------+
|         user_id|         domain|
+----------------+---------------+
|            josh|     wanadoo.fr|
|        samantha|     randomn.fr|
|             bob|    eidsiva.net|
|           dylan|    vodafone.it|
|            ryan|      chicks.it|
+----------------+---------------+

我想我可以做一些像-

desired_df = dataframe_a.join(dataframe_b, ["user_id"], how="full_outer").drop(dataframe_b.domain)

但我担心这是否会在我想要的数据框中给我ryan。这是正确的方法吗?

最佳答案

您将需要使用“合并”。在您当前的解决方案中,ryan 将位于生成的数据框中,但剩余的 dataframe_a.domain 列的值为 null。

joined_df = dataframe_a.join(dataframe_b, ["user_id"], how="full_outer")
+----------------+---------------+---------------+
|         user_id|         domain|         domain|
+----------------+---------------+---------------+
|            josh|     wanadoo.fr|  oldwebsite.fr|
|        samantha|     randomn.fr|     randomn.fr|
|             bob|    eidsiva.net|               |
|           dylan|    vodafone.it|      oldweb.it|
|            ryan|               |      chicks.it|
+----------------+---------------+---------------+

'coalesce' 允许您指定偏好顺序,但会跳过空值。

import pyspark.sql.functions as F
joined_df = joined_df.withColumn(
  "preferred_domain",
  F.coalesce(dataframe_a.domain, dataframe_b.domain)
)
joined_df = joined_df.drop(dataframe_a.domain).drop(dataframe_b.domain)

给予

+----------------+----------------+
|         user_id|preferred_domain|
+----------------+----------------+
|            josh|      wanadoo.fr|
|        samantha|      randomn.fr|
|             bob|     eidsiva.net|
|           dylan|     vodafone.it|
|            ryan|       chicks.it|
+----------------+----------------+

关于python - PySpark 数据帧 : Full Outer Join with a condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58968564/

相关文章:

python - 在 Pandas 中合并索引上的数据帧效率更高

Python Pandas - 在同一列中查找元素(子字符串)

python - 将一个数据框附加到另一个数据框

python - 运行时错误: File descriptor 8 is used by transport

python - datetime.fromtimestamp 在 Path 对象的 ctime_ns 上给出错误 22 无效参数

python - Python 3.X 中同名的类型和函数?

python - 为什么我的 while 循环永远运行 print _ ?

python - 使用 requests_mock 断言 HTTP 请求的主体

python - 等价于 wxPython 中的 HTML 多选框

python - 如何从调用模块的脚本中使用模块中的变量