如何在另一个df的列中获得df中一列的值计数?

fiei3ece  于 2021-07-09  发布在  Spark
关注(0)|答案(2)|浏览(342)

假设我有这样一个结果:

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

还有一件像这样的东西

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

我想得到 consequents 在所有的 items 数组,如:

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

我该怎么办?
我设法把这些项目排成一行,就像

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

但我不知道接下来该怎么办。

zdwk9cvp

zdwk9cvp1#

可以使用 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()
         )
kyvafyod

kyvafyod2#

让我们加载数据:

df = pd.DataFrame({'consequents':[['a'],['b'],['c']]})
dfi = pd.DataFrame({'items':[['a','b'],['a'],['b','c']]})

我们注意到 explode 在这种情况下非常有用(如查看 dfi.explode('items') . 很可能你想要的东西可以通过

dfi.explode('items').value_counts()

这给了你

items
a        2
b        2
c        1
dtype: int64

但万一 dfi 元素比中的多 df 我们可以合并。所以最终的解决办法很简单

(df.explode('consequents')
  .merge(dfi.explode('items').value_counts().to_frame(), left_on = 'consequents', right_on = 'items')  
  .rename(columns = {0:'freq'})  
)

输出

consequents freq
0   a           2
1   b           2
2   c           1

相关问题