gpt4 book ai didi

pyspark - 从pyspark中的下一列中删除空值和移位值

转载 作者:行者123 更新时间:2023-12-04 09:11:23 25 4
gpt4 key购买 nike

我需要将 Python 脚本转换为 Pyspark,这对我来说是一项艰巨的任务。
我正在尝试从数据框中删除空值(不删除整个列或行)并将下一个值移动到前一列。例子:

        CLIENT| ANIMAL_1 | ANIMAL_2 | ANIMAL_3| ANIMAL_4
ROW_1 1 | cow | frog | null | dog
ROW_2 2 | pig | null | cat | null
我的目标是:
       CLIENT| ANIMAL_1 | ANIMAL_2 | ANIMAL_3| ANIMAL_4
ROW_1 1 | cow | frog | dog | null
ROW_2 2 | pig | cat | null | null
我在 python 上使用的代码是(我在 Stackoverflow 上得到的):
df_out = df.apply(lambda x: pd.Series(x.dropna().to_numpy()), axis=1)
然后我重命名列。但我不知道如何在 Pyspark 上做到这一点。

最佳答案

以下是针对 Spark 2.4+ 版执行此操作的方法:
创建您想要的列的数组并按您的条件排序,如下所示:

  • 首先对非空值进行排序
  • 按照它们在列中出现的顺序对值进行排序

  • 我们可以使用 array_sort 进行排序.要实现多个条件,请使用 arrays_zip .为了更轻松地提取您想要的值(即本例中的动物),还需要压缩列值。
    from pyspark.sql.functions import array, array_sort, arrays_zip, col, lit

    animal_cols = df.columns[1:]
    N = len(animal_cols)

    df_out = df.select(
    df.columns[0],
    array_sort(
    arrays_zip(
    array([col(c).isNull() for c in animal_cols]),
    array([lit(i) for i in range(N)]),
    array([col(c) for c in animal_cols])
    )
    ).alias('sorted')
    )
    df_out.show(truncate=False)
    #+------+----------------------------------------------------------------+
    #|CLIENT|sorted |
    #+------+----------------------------------------------------------------+
    #|1 |[[false, 0, cow], [false, 1, frog], [false, 3, dog], [true, 2,]]|
    #|2 |[[false, 0, pig], [false, 2, cat], [true, 1,], [true, 3,]] |
    #+------+----------------------------------------------------------------+
    现在事情的顺序是正确的,您只需要提取值。在本例中,这是元素 '2' 处的项目在 sorted的第i个索引中柱子。
    df_out = df_out.select(
    df.columns[0],
    *[col("sorted")[i]['2'].alias(animal_cols[i]) for i in range(N)]
    )
    df_out.show(truncate=False)
    #+------+--------+--------+--------+--------+
    #|CLIENT|ANIMAL_1|ANIMAL_2|ANIMAL_3|ANIMAL_4|
    #+------+--------+--------+--------+--------+
    #|1 |cow |frog |dog |null |
    #|2 |pig |cat |null |null |
    #+------+--------+--------+--------+--------+

    关于pyspark - 从pyspark中的下一列中删除空值和移位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63342599/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com