计算 pyspark 数据框中的出现次数

Posted

技术标签:

【中文标题】计算 pyspark 数据框中的出现次数【英文标题】:Count ocurrences in pyspark dataframe 【发布时间】:2020-09-08 23:33:05 【问题描述】:

我需要统计一个pyspark数据框中重复值的出现次数,如图所示。 简而言之,当值相同时,它会累加,直到值不同。当值不同时,计数被重置。我需要它在一个列中。

我有什么:

+------+
| val  |
+------+
| 0    | 
| 0    | 
| 0    |
| 1    |
| 1    |
| 2    |
| 2    |
| 2    |
| 3    |
| 3    |
| 3    |
| 3    |
+------+

我需要什么:

+------+-----+
| val  |ocurr| 
+------+-----+
| 0    | 0   | 
| 0    | 1   | 
| 0    | 2   |
| 1    | 0   |
| 1    | 1   |
| 2    | 0   |
| 2    | 1   |
| 2    | 2   |
| 3    | 0   |
| 3    | 1   |
| 3    | 2   |
| 3    | 3   |
+------+-----+

【问题讨论】:

【参考方案1】:

使用whenlag 函数对相同的并发值进行分组,并使用row_number 获取计数。您应该有一个适当的排序列,我的临时排序列id 不好,因为它不能保证保留顺序。

df = spark.createDataFrame([0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0], 'int').toDF('val')

from pyspark.sql.functions import *
from pyspark.sql import Window

w1 = Window.orderBy('id')
w2 = Window.partitionBy('group').orderBy('id')

df.withColumn('id', monotonically_increasing_id()) \
  .withColumn('group', sum(when(col('val') == lag('val', 1, 1).over(w1), 0).otherwise(1)).over(w1)) \
  .withColumn('order', row_number().over(w2) - 1) \
  .orderBy('id').show()

+---+---+-----+-----+
|val| id|group|order|
+---+---+-----+-----+
|  0|  0|    1|    0|
|  0|  1|    1|    1|
|  0|  2|    1|    2|
|  1|  3|    2|    0|
|  1|  4|    2|    1|
|  2|  5|    3|    0|
|  2|  6|    3|    1|
|  2|  7|    3|    2|
|  3|  8|    4|    0|
|  3|  9|    4|    1|
|  3| 10|    4|    2|
|  3| 11|    4|    3|
|  0| 12|    5|    0|
|  0| 13|    5|    1|
|  0| 14|    5|    2|
+---+---+-----+-----+

【讨论】:

以上是关于计算 pyspark 数据框中的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:计算列表中不同元素的出现次数

如何在 Pyspark 2.1 中使用窗口函数来计算星期几的出现次数

PySpark / 计算出现次数并使用 UDF 创建新列

计算 pyspark 数据框中的聚类成本

从 Pyspark 中的数据框中计算空值和非空值

Python:计算python数据框中每个数字的出现次数