【问题标题】:Transform rows and column and create a similarity dataframe using pyspark使用 pyspark 转换行和列并创建相似性数据框
【发布时间】:2021-12-30 09:50:10
【问题描述】:

我已经有一个标准化的数据集:

 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 列的值之上/之下。我的问题是,我不太明白如何在对角线上制作单位。

【问题讨论】:

  • 对称矩阵中的值应该是什么意思?如果您的元组不是唯一的,您使用的是什么聚合?
  • 这是短语流行的百分比,即平均值。我没有使用聚合函数,但我自己算了。首先,有一列包含所有短语。所有短语都使用count计数并除以平均值,从而获得百分比。这些值位于 common_persent 列中。问题是,当用列改变行的位置时,如果短语匹配,我需要添加一个对角线,所以百分比是 1.0
  • 如果您知道如何从对角线上填充值,请先填充它们,然后使用 fillna(1) 填充对角线值。
  • 问题是我不明白如何将我的数据框转置为相似矩阵。

标签: python pandas dataframe apache-spark pyspark


【解决方案1】:

您可以简单地旋转您的数据框。

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|
+-----------+----------+-----------+----------+

【讨论】:

    【解决方案2】:

    要将您的数据框转换为相似度矩阵,您必须遵循几个步骤:

    • 首先,通过创建一个数组来创建phrase1/phrase2 的排列列表,然后在该数组上使用explode
    • 然后,按照Lamanus' answer 中的说明旋转您的数据框
    • 最后,使用fillna1.0 填充null
    • (可选)重新排序您的 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       |
    +-----------+----------+---------+-----------+----------+
    

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多