【问题标题】:How do I count frequency of each categorical variable in a column in pyspark dataframe for multiple columns?如何计算 pyspark 数据框中每个分类变量在多列中的频率?
【发布时间】:2019-12-05 03:05:41
【问题描述】:

我想计算一列中每个类别的频率,并将列中的值替换为频率计数。我想为 pyspark 数据框的 pyspark 中的多个列执行此操作。

例如,考虑以下数据框:

+-------+-------+-------+  
| col_1 | col_2 | col_3 |
+-------+-------+-------+  
|   a   |   f   |   g   |  
|   c   |   e   |   a   |  
|   a   |   d   |   g   |  
|   a   |   d   |   g   |  
|   b   |   f   |   b   |  
|   c   |   d   |   g   |  
|   b   |   d   |   c   |  
|   a   |   d   |   g   |  
|   b   |   f   |   g   |  
+-------+-------+-------+  

我想将此 pyspark 数据帧转换为以下内容:

+-------+-------+-------+  
| col_1 | col_2 | col_3 |
+-------+-------+-------+ 
|   4   |   3   |   6   |
|   2   |   1   |   1   |
|   4   |   5   |   6   |
|   4   |   5   |   6   |
|   3   |   2   |   1   |
|   2   |   5   |   6   |
|   3   |   5   |   1   |
|   4   |   5   |   6   |
|   3   |   2   |   6   |
+-------+-------+-------+  

我有以下代码:

spark = SparkSession.builder.getOrCreate()

df = spark.read.parquet(data)
df.show()

+-------+-------+-------+
| col_1 | col_2 | col_3 |
+-------+-------+-------+
|   a   |   f   |   g   |
|   c   |   e   |   a   |
|   a   |   d   |   g   |
|   a   |   d   |   g   |
|   b   |   f   |   b   |
|   c   |   d   |   g   |
|   b   |   d   |   c   |
|   a   |   d   |   g   |
|   b   |   f   |   g   |
+-------+-------+-------+

我可以使用以下代码使用 for 循环计算每列的频率:

df.groupby('col_1').count().toDF('category', 'count').show()

我知道我可以对每一列都执行此操作并将结果粘合在一起。我想知道是否有更好的方法。

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    您可以使用window 函数来实现:

    import pyspark.sql.functions as F
    from pyspark.sql import Window
    
    l = [
    (   'a'   ,   'f'   ,   'g'   ),
    (   'c'   ,   'e'   ,   'a'   ),
    (   'a'   ,   'd'   ,   'g'   ),
    (   'a'   ,   'd'   ,   'g'   ),
    (   'b'   ,   'f'   ,   'b'   ),
    (   'c'   ,   'd'   ,   'g'   ),
    (   'b'   ,   'd'   ,   'c'   ),
    (   'a'   ,   'd'   ,   'g'   ),
    (   'b'   ,   'f'   ,   'g'  )
    ]
    
    columns = ['col_1', 'col_2','col_3']
    
    df=spark.createDataFrame(l, columns)
    
    
    for column in columns:
        df = df.withColumn(column, F.count(column).over(Window.partitionBy(column)))
    
    df.show()
    

    输出:

    +-----+-----+-----+ 
    |col_1|col_2|col_3| 
    +-----+-----+-----+ 
    |    4|    3|    6| 
    |    3|    3|    6| 
    |    4|    5|    6| 
    |    4|    5|    6| 
    |    4|    5|    6| 
    |    2|    5|    6| 
    |    3|    5|    1| 
    |    3|    3|    1| 
    |    2|    1|    1|
    +-----+-----+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多