首页 文章

如何在每个列中转换DataFrame以在pyspark中创建两个新列?

提问于
浏览
1

我有一个数据帧“x”,其中有两列“x1”和“x2”

x1(status)    x2  
kv,true       45
bm,true       65
mp,true       75
kv,null       450
bm,null       550
mp,null       650

我想将此数据帧转换为根据其状态和值过滤数据的格式

x1  true  null
kv   45    450
bm   65    550
mp   75    650

有没有办法做到这一点,我正在使用pyspark datadrame

1 回答

  • 2

    是的,有一种方法 . 首先使用split函数将第一列拆分为 , ,然后将此数据帧拆分为两个数据帧(使用 where 两次),并在第一列上简单地连接这些新数据帧 .

    在Spark API for Scala中,它如下:

    val x1status = Seq(
      ("kv,true",45),
      ("bm,true",65),
      ("mp,true",75),
      ("kv,null",450),
      ("bm,null",550),
      ("mp,null",650)).toDF("x1", "x2")
    
    val x1 = x1status
      .withColumn("split", split('x1, ","))
      .withColumn("x1", 'split getItem 0)
      .withColumn("status", 'split getItem 1)
      .drop("split")
    
    scala> x1.show
    +---+---+------+
    | x1| x2|status|
    +---+---+------+
    | kv| 45|  true|
    | bm| 65|  true|
    | mp| 75|  true|
    | kv|450|  null|
    | bm|550|  null|
    | mp|650|  null|
    +---+---+------+
    
    val trueDF = x1.where('status === "true").withColumnRenamed("x2", "true")
    val nullDF = x1.where('status === "null").withColumnRenamed("x2", "null")
    
    val result = trueDF.join(nullDF, "x1").drop("status")
    
    scala> result.show
    +---+----+----+
    | x1|true|null|
    +---+----+----+
    | kv|  45| 450|
    | bm|  65| 550|
    | mp|  75| 650|
    +---+----+----+
    

相关问题