我已經有一個標準化的資料集:
df = spark.createDataFrame([('red apple', 'ripe banana', 0.3),
('red apple', 'hot pepper', 0.4),
('red apple','sweet kiwi', 0.5),
('ripe banana','hot pepper', 0.6),
('ripe banana','sweet kiwi', 0.7),
('hot pepper','sweet kiwi', 0.8)], ["phrase1", "phrase2", 'common_persent'])
df.show()
----------- ----------- --------------
| phrase1| phrase2|common_persent|
----------- ----------- --------------
| red apple|ripe banana| 0.3|
| red apple| hot pepper| 0.4|
| red apple| sweet kiwi| 0.5|
|ripe banana| hot pepper| 0.6|
|ripe banana| sweet kiwi| 0.7|
| hot pepper| sweet kiwi| 0.8|
----------- ----------- --------------
我想使用 pyspark 創建一個相似度矩陣。結果應如下所示:
----------- --------- ----------- ---------- ----------
| phrases|red apple|ripe banana|hot pepper|sweet kiwi|
----------- --------- ----------- ---------- ----------
| red apple| 1.0| 0.3| 0.4| 0.5|
|ripe banana| 0.3| 1.0| 0.6| 0.7|
| hot pepper| 0.4| 0.6| 1.0| 0.8|
| sweet kiwi| 0.5| 0.7| 0.8| 1.0|
----------- --------- ----------- ---------- ----------
因此,在對角線上有單位,并且在列的值之上/之下average。我的問題是,我不太明白如何在對角線上制作單位。
uj5u.com熱心網友回復:
您可以簡單地旋轉資料框。
from pyspark.sql import functions as f
df.groupBy('phrase1').pivot('phrase2').agg(f.first('common_persent')).show()
----------- ---------- ----------- ----------
| phrase1|hot pepper|ripe banana|sweet kiwi|
----------- ---------- ----------- ----------
| red apple| 0.4| 0.3| 0.5|
|ripe banana| 0.6| null| 0.7|
| hot pepper| null| null| 0.8|
----------- ---------- ----------- ----------
uj5u.com熱心網友回復:
要將您的資料框轉換為相似性矩陣,您必須執行以下幾個步驟:
- 首先,通過創建一個陣列然后
explode在這個陣列上使用來創建phrase1/phrase2的排列串列 - 然后,按照Lamanus 的回答中的說明旋轉您的資料框
- 最后,使用填充
null值1.0fillna - 可選地,重新排序您的
phrases列
完整代碼如下:
from pyspark.sql import functions as F
result = df.withColumn(
'permutations',
F.array(
F.struct(F.col('phrase1').alias('first'), F.col('phrase2').alias('second')),
F.struct(F.col('phrase2').alias('first'), F.col('phrase1').alias('second'))
)
) \
.drop('phrase1', 'phrase2') \
.select(F.explode('permutations'), F.col('common_persent')) \
.select("col.*", "common_persent") \
.groupBy(F.col('first').alias('phrases')) \
.pivot('second') \
.agg(F.first('common_persent')) \
.fillna(1.0) \
.orderBy('phrases')
使用您的df資料框,它為您提供以下result資料框:
----------- ---------- --------- ----------- ----------
|phrases |hot pepper|red apple|ripe banana|sweet kiwi|
----------- ---------- --------- ----------- ----------
|hot pepper |1.0 |0.4 |0.6 |0.8 |
|red apple |0.4 |1.0 |0.3 |0.5 |
|ripe banana|0.6 |0.3 |1.0 |0.7 |
|sweet kiwi |0.8 |0.5 |0.7 |1.0 |
----------- ---------- --------- ----------- ----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360930.html
下一篇:使用isin(list)過濾資料框時,“ValueError:Columnsmustbethesamelengthaskey”
