簡體   English   中英

PySpark Dataframe 將列轉換為行

[英]PySpark Dataframe transform columns into rows

我有以下數據框

REC_DATA = spark.createDataFrame(
    [
      ('exercise', 'fiber', 'rice', 'male'),
      ('exercise', 'rice', 'fiber', 'female'),
      ('exercise', 'water', 'fiber', 'male'),
      ('exercise', 'rice', 'exercise', 'female'),
    ], 
      StructType(
        [
            StructField("1_rec", StringType(), False),
            StructField("2_rec", StringType(), False),
            StructField("3_rec", StringType(), False),
            StructField("sex", StringType(), True),
        ]
    )
)
1_rec 2_rec 3_rec 性別
鍛煉 纖維 白飯 男性
鍛煉 白飯 纖維 女性
鍛煉 纖維 男性
白飯 鍛煉 女性

我試圖將這些行分組到一個新列中,將列 1_rec、2_rec、3_rec 轉換為行,並添加一個帶有數量的新列,輸出應該是這樣的:

位置 名稱 數數
1_rec 鍛煉 3
1_rec 1
2_rec 1
2_rec 白飯 2
2_rec 纖維 1
3_rec 白飯 1
3_rec 纖維 2
3_rec 鍛煉 1

我曾嘗試做一個交叉表,但它沒有正常工作。

使用stack對逆透視列進行排序,然后按位置名稱對它們進行分組

import pyspark.sql.functions as F

REC_DATA = (REC_DATA
            .selectExpr("stack(3, '1_rec', 1_rec, '2_rec', 2_rec, '3_rec', 3_rec) (position, name)")
            .groupBy('position', 'name')
            .agg(F.count("*").alias('count')))
REC_DATA.show()

+--------+--------+-----+
|position|    name|count|
+--------+--------+-----+
|   1_rec|   water|    1|
|   2_rec|    rice|    2|
|   3_rec|exercise|    1|
|   3_rec|   fiber|    2|
|   2_rec|   water|    1|
|   3_rec|    rice|    1|
|   1_rec|exercise|    3|
|   2_rec|   fiber|    1|
+--------+--------+-----+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM