【问题标题】:Shift pyspark column value to left by one将 pyspark 列值向左移动 1
【发布时间】:2020-08-06 09:15:41
【问题描述】:

我有一个如下所示的 pyspark 数据框:

|name|age|height      |weight             
+-------------+--------------------+------------------------+------------------------+-------------------------+--------------------+------------------+------------------+------------+
|  |Mike       |20|6-7|

如您所见,值和列名未对齐。例如,“Mike”应该在“name”列下,而不是年龄。

如何将值向左移动一位,以便与列名匹配? 理想的数据框如下所示:

   |name|age|height  |weight             
    +-------------+--------------------+------------------------+------------------------+-------------------------+--------------------+------------------+------------------+------------+
    | Mike  |20  |6-0|160|

请注意,以上数据仅为示例。实际上,我有超过 200 列和超过 100 万行的数据。

【问题讨论】:

    标签: dataframe pyspark


    【解决方案1】:

    通过从数据框中删除 name column 来尝试使用 .toDF 和新的列名。

    Example:

    df=spark.createDataFrame([('','Mike',20,'6-7',160)],['name','age','height','weight'])
    df.show()
    #+----+----+------+------+---+
    #|name| age|height|weight| _5|
    #+----+----+------+------+---+
    #|    |Mike|    20|   6-7|160|
    #+----+----+------+------+---+
    
    #select all columns except name
    df1=df.select(*[i for i in df.columns if i != 'name'])
    
    drop_col=df.columns.pop()
    req_cols=[i for i in df.columns if i != drop_col]
    
    df1.toDF(*req_cols).show()
    #+----+---+------+------+
    #|name|age|height|weight|
    #+----+---+------+------+
    #|Mike| 20|   6-7|   160|
    #+----+---+------+------+
    

    Using spark.createDataFrame():

    cols=['name','age','height','weight']
    
    spark.createDataFrame(df.select(*[i for i in df.columns if i != 'name']).rdd,cols).show()
    #+----+---+------+------+
    #|name|age|height|weight|
    #+----+---+------+------+
    #|Mike| 20|   6-7|   160|
    #+----+---+------+------+
    

    如果您在 reading a file创建数据框,那么 define schema 的第一列名称为 dummy,那么一旦您读取数据使用.drop() 函数删除列。

    spark.read.schema(<struct_type schema>).csv(<path>).drop('<dummy_column_name>')
    
    spark.read.option("header","true").csv(<path>).toDF(<columns_list_with dummy_column>).drop('<dummy_column_name>')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多