我在pyspark有以下方案的資料框:
user_id datadate page_1.A page_1.B page_1.C page_2.A page_2.B \
0 111 20220203 NaN NaN NaN NaN NaN
1 222 20220203 5 5 5 5.0 5.0
2 333 20220203 3 3 3 3.0 3.0
page_2.C page_3.A page_3.B page_3.C
0 NaN 1.0 1.0 2.0
1 5.0 NaN NaN NaN
2 4.0 NaN NaN NaN
因此,它包含 user_id、datadate 之類的列,以及每頁的幾列(有 3 頁),它們是 2 次連接的結果。在這個例子中,我有 page_1、page_2、page_3,每個都有 3 列:A、B、C。此外,對于每一頁的列,對于每一行,它們要么全部為空,要么全部為滿,就像在我的示例中一樣。我不關心每頁每一列的值,我只想為每一行獲取不為空的 [A,B,C] 值。
想要的結果表的示例:
user_id datadate A B C
0 111 20220203 1 1 2
1 222 20220203 5 5 5
2 333 20220203 3 3 3
所以邏輯將是這樣的:
df[A] = page_1.A or page_2.A or page_3.A, whichever is not null
df[B] = page_1.B or page_2.B or page_3.B, whichever is not null
df[C] = page_1.C or page_2.C or page_3.C, whichever is not null
對于所有的行..當然,我想以一種有效的方式來做。非常感謝。
uj5u.com熱心網友回復:
您可以使用 sql 函式greatest來提取列串列中的最大值。您可以在此處找到檔案:https ://spark.apache.org/docs/3.1.1/api/python/reference/api/pyspark.sql.functions.greatest.html
from pyspark.sql import functions as F
(df.withColumn('A', F.greates(F.col('page_1.A'), F.col('page_2.A), F.col('page_3.A'))
.withColumn('B', F.greates(F.col('page_1.B'), F.col('page_2.B), F.col('page_3.B'))
.select('userid', 'datadate', 'A', 'B'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447333.html
