我的資料框看起來像:
| 分類名稱 | 甲類 | 貓B |
|---|---|---|
| 甲類 | 0.25 | 0.75 |
| 貓B | 0.5 | 0.5 |
其中 categoryName 為 String 型別,而 cat* 為 Double。我想添加一個列,該列將包含名稱在 categoryName 列中的列中的值:
| 分類名稱 | 甲類 | 貓B | 分數 |
|---|---|---|---|
| 甲類 | 0.25 | 0.75 | 0.25 |
| 貓B | 0.5 | 0.7 | 0.7 |
在第一行'score'的值來自列名'catA' 在第二行'score'值來自列名'catB' 謝謝
uj5u.com熱心網友回復:
一種方法是根據每一行的列名和值創建一個映射,然后使用在所需列中定義的值訪問該映射。
這樣做的好處在于它可以為您想要的任意數量的列作業。
例子:
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
data = [
{"categoryName": "catA", "catA": 0.25, "catB": 0.75},
{"categoryName": "catB", "catA": 0.5, "catB": 0.7},
]
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(data)
df = (
df.withColumn(
"map", F.expr("map(" ",".join([f"'{c}', {c}" for c in df.columns]) ")")
)
.withColumn("score", F.expr("map[categoryName]"))
.drop("map")
)
結果:
---- ---- ------------ -----
|catA|catB|categoryName|score|
---- ---- ------------ -----
|0.25|0.75|catA |0.25 |
|0.5 |0.7 |catB |0.7 |
---- ---- ------------ -----
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376292.html
