如何使用其他记录中的值填充PySpark DataFrame列中的空值?

fcg9iug3  于 2023-01-29  发布在  Spark
关注(0)|答案(2)|浏览(198)

我有一个PySpark DataFrame,其中包含"Country"和"Continent"列。在一些记录中,缺少"Continent"的值。但是,有一些记录包含同一个国家的"Continent"(下面示例数据集中的"Italy"和"China")。

# Prepare Data
data = [
    (1, "Italy", "Europe"),
    (2, "Italy", "Europe"),
    (3, "Italy", None),
    (4, "Italy", None),
    (5, "China", "Asia"),
    (6, "China", None),
    (7, "Japan", "Asia"),
    (8, "France", None),
]

# Create DataFrame
columns = ["Code", "Country", "Continent"]
df = spark.createDataFrame(data=data, schema=columns)
df.show(truncate=False)

对于"洲"为Null的记录,我希望:

  • 查找"洲"不为空的同一国家/地区的任何记录
  • 获取"Continent"的值并填入空值

预期输出如下所示:
| 代码|国家|洲|
| - ------|- ------|- ------|
| 1个|"意大利"|"欧洲"|
| 第二章|"意大利"|"欧洲"|
| 三个|"意大利"|"欧洲"|
| 四个|"意大利"|"欧洲"|
| 五个|"中国"|"亚洲"|
| 六个|"中国"|"亚洲"|
| 七|"日本"|"亚洲"|
| 八个|"法国"|无效|
你知道怎么做吗?

xzabzqsa

xzabzqsa1#

下面是其中一个解决方案,假设每个国家只有一个不同的Continent值,您可以在每个国家分区中使用max()

df2 = df.withColumn(
    "Continent",
    func.when(
        func.col("Continent").isNull(),
        func.max("Continent").over(Window.partitionBy(func.col("Country"))),
    ).otherwise(func.col("Continent")),
).orderBy("code")
df2.show(truncate=False)

    +----+-------+---------+
    |Code|Country|Continent|
    +----+-------+---------+
    |1   |Italy  |Europe   |
    |2   |Italy  |Europe   |
    |3   |Italy  |Europe   |
    |4   |Italy  |Europe   |
    |5   |China  |Asia     |
    |6   |China  |Asia     |
    |7   |Japan  |Asia     |
    |8   |France |null     |
    +----+-------+---------+

或者,您可以创建一个较小的"参考" Dataframe ,并将广播连接回主 Dataframe 。

qyswt5oh

qyswt5oh2#

另一个解决方案,同样的结果:

from pyspark.sql import functions as F, Window 

df.withColumn(
    "continent",
    F.coalesce(
        F.col("continent"),
        F.first("continent").over(Window.partitionBy("country")),
    ),
).show()
+----+-------+---------+
|Code|Country|continent|
+----+-------+---------+
|   5|  China|     Asia|
|   6|  China|     Asia|
|   8| France|     null|
|   1|  Italy|   Europe|
|   2|  Italy|   Europe|
|   3|  Italy|   Europe|
|   4|  Italy|   Europe|
|   7|  Japan|     Asia|
+----+-------+---------+

相关问题