簡體   English   中英

將包含結構的 Dataframe 列拆分為新列

[英]Splitting Dataframe column containing structs into new columns

我有一個名為 df 的 Dataframe 具有​​以下結構:

root
|-- country: string (nullable = true)
|-- competition: string (nullable = true)
|-- competitor: array (nullable = true)
    |-- element: struct (containsNull = true)
    |   |-- name: string (nullable = true)
        |-- time: string (nullable = true)

看起來像這樣:

|country|competiton|competitor      |
|___________________________________| 
|USA    |WN        |[{Adam, 9.43}]  |
|China  |FN        |[{John, 9.56}]  |
|China  |FN        |[{Adam, 9.48}]  |
|USA    |MNU       |[{Phil, 10.02}] |
|...    |...       |...             |

我想根據每個結構中的值將 pivot(或類似的東西)競爭對手列到新列中,所以它看起來像這樣:

|country|competition|Adam|John|Phil  |
|____________________________________| 
|USA    |WN         |9.43|... |...   |
|China  |FN         |9.48|9.56|...   |
|USA    |MNU        |... |... |10.02 |              

這些名稱是唯一的,所以如果列已經存在,我不想創建一個新的,而是在已經創建的一個中填充值。 名稱很多,因此需要動態完成。

我有一個相當大的數據集,所以我不能使用 Pandas。

我們可以從數組中提取結構,然后從該結構中創建新列。 name列可以使用time作為值進行旋轉。

data_sdf. \
    withColumn('name_time_struct', func.col('competitor')[0]). \
    select('country', 'competition', func.col('name_time_struct.*')). \
    groupBy('country', 'competition'). \
    pivot('name'). \
    agg(func.first('time')). \
    show()

+-------+-----------+----+----+-----+
|country|competition|Adam|John| Phil|
+-------+-----------+----+----+-----+
|    USA|        MNU|null|null|10.02|
|    USA|         WN|9.43|null| null|
|  China|         FN|9.48|9.56| null|
+-------+-----------+----+----+-----+

PS這假設數組中只有1個結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM