繁体   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