我有一個這樣的資料框
------------ ----------------- -------------------------------
| Name | Age | Answers |
------------ ----------------- -------------------------------
| Maria | 23 | [apple, mango, orange, banana]|
| John | 55 | [apple, orange, banana] |
| Brad | 44 | [banana] |
------------ ----------------- -------------------------------
answers 列包含一個元素陣列
預期產出
------------ ----------------- -------------------------------
| Name | Age | apple | mango |orange| banana |
------------ ----------------- -------------------------------
| Maria | 23 | True | True | True | True |
| John | 55 | True | False| True | True |
| Brad | 44 | False | False | False| True |
------------ ----------------- -------------------------------
有沒有辦法可以將陣列列轉換為 True 和 False 列?
提前致謝。
uj5u.com熱心網友回復:
如果您事先不知道Answers陣列的所有可能值,則可以求助于以下使用explode 的解決方案pivot。
df \
.withColumn("answer", F.explode("Answers")) \
.drop("Answers") \
.groupBy("Name", "Age") \
.pivot("answer") \
.agg(F.first("answer").isNotNull()) \
.na \
.fill(False)
如果您不知道可能的值,它很重,就像樞軸一樣。
解決方案說明
1.陣列爆炸
.withColumn("answer", F.explode("Answers")) \
.drop("Answers")
該explode函式將為Answers陣列中的每個值創建 N 個不同的行。
----- --- --------
| Name|Age| answer|
----- --- --------
|Maria| 23| apple|
|Maria| 23| mango|
|Maria| 23| orange|
|Maria| 23| banana|
| John| 55| apple|
| John| 55| orange|
| John| 55| banana|
| Brad| 44| banana|
----- --- --------
2. 樞軸
.groupBy("Name", "Age") \
.pivot("answer") \
.agg(F.first("answer").isNotNull())
通過為列中的每個不同值創建一列來轉置列中的answer行。
如果你有一個唯一標識每一行的列(即一個 id)并且你在groupBy.
----- --- ----- ------ ----- ------
| Name|Age|apple|banana|mango|orange|
----- --- ----- ------ ----- ------
| John| 55| true| true| null| true|
|Maria| 23| true| true| true| true|
| Brad| 44| null| true| null| null|
----- --- ----- ------ ----- ------
3.修復缺失值
null在資料透視期間報告缺失值。根據需要將所有nulls替換false為。
.na \
.fill(False)
----- --- ----- ------ ----- ------
| Name|Age|apple|banana|mango|orange|
----- --- ----- ------ ----- ------
| John| 55| true| true|false| true|
|Maria| 23| true| true| true| true|
| Brad| 44|false| true|false| false|
----- --- ----- ------ ----- ------
uj5u.com熱心網友回復:
一個可能的解決方案是,知道所有可能答案的串列,為每個答案創建一個列,說明“答案”列是否包含該行的特定答案。
假設呼叫了可能的答案串列possible_answers(所以,在你的情況下是['orange', 'apple', 'mango', 'banana']),那么下面的代碼會產生DataFrame你想要的(假設那df是你的輸入DataFrame):
from pyspark.sql import functions as F
for c in sorted(possible_answers): # sorted is optional, but guarantees the order of the columns
df = df.withColumn(c, F.array_contains('Answers', c))
df = df.drop('Answers')
如果您事先不知道所有可能的答案,您可以從輸入中推斷出它們DataFrame:
possible_answers = df.select(F.concat(F.col('Answers'))).distinct().collect()[0][0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/524753.html
下一篇:如何查找列中具有最高值的行的名稱
