【问题标题】:PySpark Dataframe transform columns into rowsPySpark Dataframe 将列转换为行
【发布时间】:2021-07-23 12:51:09
【问题描述】:

我有以下数据框

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 sex
exercise fiber rice male
exercise rice fiber female
exercise water fiber male
water rice exercise female

我正在尝试将这些行分组为一个新列,将列 1_rec、2_rec、3_rec 转换为行,并添加一个带有数量的新列,输出应该是这样的:

Position name count
1_rec exercise 3
1_rec water 1
2_rec water 1
2_rec rice 2
2_rec fiber 1
3_rec rice 1
3_rec fiber 2
3_rec exercise 1

我曾尝试做一个交叉表,但它不能正常工作。

【问题讨论】:

    标签: python pyspark apache-spark-sql


    【解决方案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|
    +--------+--------+-----+
    
    

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2022-12-18
      • 2017-11-08
      • 2016-05-29
      • 1970-01-01
      相关资源
      最近更新 更多