我有這樣的資料框:
id feature value
a aa 0.5
b ab 0.1
a ab 0.2
a cc 0.3
c ab 0.9
b bb 1
我假設特征列中總共有 4 個唯一值,并且所有id可能不對應于所有特征,所以我想要另一個資料幀,其中id將對應于它具有的特征值,否則如果該特征不存在,則為 0。
例如:
feature_list = ['aa', 'ab', 'cc', 'bb']
id feature_vector
a [0.5, 0.2, 0.3, 0]
b [0, 0.1, 0, 1]
c [0, 0.9, 0, 0]
uj5u.com熱心網友回復:
您可以通過旋轉然后使用 to_array 來選擇特征來達到預期的結果。
看下面的代碼,
sdf_pivoted = sdf \
.groupby("id") \
.pivot("feature") \
.agg(sf.first("value")) \
.fillna(0.0)
sdf_pivoted.show()
--- --- --- --- ---
| id| aa| ab| bb| cc|
--- --- --- --- ---
| c|0.0|0.9|0.0|0.0|
| a|0.5|0.2|0.0|0.3|
| b|0.0|0.1|1.0|0.0|
--- --- --- --- ---
l_cols = [c for c in sdf_pivoted.columns if c != 'id']
sdf_pivoted \
.select("id", sf.array(*l_cols)) \
.show()
--- ---------------------
| id|array(aa, ab, bb, cc)|
--- ---------------------
| c| [0.0, 0.9, 0.0, 0.0]|
| a| [0.5, 0.2, 0.0, 0.3]|
| b| [0.0, 0.1, 1.0, 0.0]|
--- ---------------------
您可以根據需要重命名列。
uj5u.com熱心網友回復:
您可以創建地圖并從中提取值。
from pyspark.sql import functions as F
df = spark.createDataFrame(
[('a', 'aa', 0.5),
('b', 'ab', 0.1),
('a', 'ab', 0.2),
('a', 'cc', 0.3),
('c', 'ab', 0.9),
('b', 'bb', 1.0)],
['id', 'feature', 'value'])
feature_list = ['aa', 'ab', 'cc', 'bb']
df = df.groupBy('id').agg(F.map_from_entries(F.collect_set(F.struct('feature', 'value'))).alias('map'))
df = df.withColumn('arr', F.array([F.lit(x) for x in feature_list]))
df = df.select('id', F.expr("transform(arr, x -> coalesce(map[x], 0)) feature_vector"))
df.show()
# --- --------------------
# | id| feature_vector|
# --- --------------------
# | c|[0.0, 0.9, 0.0, 0.0]|
# | b|[0.0, 0.1, 0.0, 1.0]|
# | a|[0.5, 0.2, 0.3, 0.0]|
# --- --------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/491354.html
標籤:数据框 阿帕奇火花 pyspark apache-spark-sql
上一篇:將地圖分成兩列pyspark
下一篇:根據所有列值在熊貓中選擇一行
