對于一項任務,我被要求將客戶的名稱縮短為每個名稱的第一個字母,它們之間用空格字符分隔。
我在 Python 中找到了很多解決方案,但我無法將其轉換為資料框。
DF 看起來像這樣:
| ID | Name |
| -------- | -------------- |
| 1 | John Doe |
| 2 | Roy Lee Winters|
| 3 | Mary-Kate Baron|
我想要的輸出是:
| ID | Name | Shortened_name|
| -------- | -------- | -------------- |
| 1 | John Doe | JD |
| 2 | Roy Lee Winters | RLW |
| 3 | Mary-Kate Baron | MB |
我用下面的代碼得到了一些結果,但是當有超過 2 個名字時,這不起作用。我還想要一些更“靈活”的代碼,因為有些人有 4 或 5 個名字,而其他人只有 1 個。
df.withColumn("col1", F.substring(F.split(F.col("Name"), " ").getItem(0), 1, 1))\
.withColumn("col2", F.substring(F.split(F.col("Name"), " ").getItem(1), 1, 1))\
.withColumn('Shortened_name', F.concat('col1', 'col2'))
uj5u.com熱心網友回復:
您可以拆分Name列,然后transform在結果陣列上使用函式來獲取每個元素的第一個字母:
from pyspark.sql import functions as F
df = spark.createDataFrame([(1, "John Doe"), (2, "Roy Lee Winters"), (3, "Mary-Kate Baron")], ["ID", "Name"])
df1 = df.withColumn(
"Shortened_name",
F.array_join(F.expr("transform(split(Name, ' '), x -> left(x, 1))"), "")
)
df1.show()
# --- --------------- --------------
# | ID| Name|Shortened_name|
# --- --------------- --------------
# | 1| John Doe| JD|
# | 2|Roy Lee Winters| RLW|
# | 3|Mary-Kate Baron| MB|
# --- --------------- --------------
或者通過使用aggregate函式:
df1 = df.withColumn(
"Shortened_name",
F.expr("aggregate(split(Name, ' '), '', (acc, x) -> acc || left(x, 1))")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420928.html
標籤:
上一篇:按期間分組的滾動總和
