>

열에서 각 범주의 빈도를 계산하고 열의 값을 빈도 수로 바꾸고 싶습니다. 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-loop를 사용하여 각 열의 빈도를 계산할 수 있습니다.

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

열마다이 작업을 수행하고 결과를 서로 붙일 수 있음을 이해합니다. 더 좋은 방법이 있는지 궁금합니다.

  • 답변 # 1

    창 기능으로이를 달성 할 수 있습니다 :

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

관련 자료

  • 이전 github - 클라이언트 비밀을 어디에서 어떻게 유지해야합니까?
  • 다음 typescript - 앵귤러 소재 - 평평한 나무와 중첩 된 나무의 차이점