首页 > 解决方案 > 如何在另一个 DF 的列中获取 DF 的一列中的值的计数?

问题描述

假设我有一个这样的结果 DF:

consequents
___________
['a']
['b']
['c']

和另一个像这样的项目DF

items
_____
['a', 'b']
['a']
['b', 'c']

我想获得consequents所有items数组中的总频率,例如:

consequents  |  freq
___________   _______
['a']          2
['b']          2
['c']          1

我该怎么办?

我设法将项目 DF 变成单行,例如

items
_____
[['a', 'b'], ['a'], ['b', 'c']]

但我不确定从这里去哪里。

标签: apache-sparkpysparkapache-spark-sql

解决方案


您可以使用arrays_overlap条件连接两个数据框,然后进行分组并计数:

import pyspark.sql.functions as F

result = (items.join(consequents, F.arrays_overlap('items', 'consequents'))
               .groupBy('consequents')
               .count()
         )

result.show()
+-----------+-----+
|consequents|count|
+-----------+-----+
|        [c]|    1|
|        [b]|    2|
|        [a]|    2|
+-----------+-----+

对于较旧的 Spark 版本 (< 2.4),您可以改用array_contains条件:

import pyspark.sql.functions as F

result = (items.join(consequents, F.expr("array_contains(items, consequents[0])"))
               .groupBy('consequents')
               .count()
         )

推荐阅读