【问题标题】:Combine values from multiple columns into one Pyspark Dataframe [duplicate]将多列中的值合并到一个 Pyspark Dataframe [重复]
【发布时间】:2020-12-08 23:35:27
【问题描述】:

我有一个 pyspark 数据框,其中包含以下字段: “ID”, "fields_0_type" , "fields_0_price", "fields_1_type", “fields_1_price”

+------------------+--------------+-------------+-------------+---
|id  |fields_0_type|fields_0_price|fields_1_type|fields_1_price|
+------------------+-----+--------+-------------+----------+
|1234| Return      |45            |New          |50           |
+--------------+----------+--------------------+------------+

如何将这些值的值保存到名为“类型”和“价格”的两列中作为列表,并用“,”分隔值。理想的数据框如下所示:

  +--------------------------- +------------------------------+
    |id     |type              | price
    +---------------------------+------------------------------+
    |1234   |Return,Upgrade    |45,50
    

请注意,我在这里提供的数据是一个示例。实际上,我需要合并的不仅仅是“类型”和“价格”列。

更新:

谢谢它的工作。但是有什么办法可以摆脱多余的“,”?这些是由于列中存在空白值这一事实造成的。有没有办法不接受那些包含空白值的列? 现在显示的内容:

+------------------------------------------------------------------+
|type                                                   |
+------------------------------------------------------------------+
|New,New,New,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,        |
|New,New,Sale,Sale,New,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|
+------------------------------------------------------------------+

我想要它:

+------------------------------------------------------------------+
    |type                                                   |
    +------------------------------------------------------------------+
    |New,New,New        |
    |New,New,Sale,Sale,New|
    +------------------------------------------------------------------+

【问题讨论】:

  • 在使用concat_ws 之前将空格替换为lit(None) 之类的df = df.select(*[when(col(c) == "", lit(None)).otherwise(col(c)) for c in cols]) 或使用regexp_replace 删除尾随逗号。
  • 这里的“cols”指的是什么?
  • cols 应该是 df.columns - 这是一个错字

标签: python dataframe pyspark


【解决方案1】:

将所有列投射到 array 中,然后使用 concat_ws 函数。

Example:

df.show()
#+----+-------------+-------------+-------------+
#|  id|fields_0_type|fields_1_type|fields_2_type|
#+----+-------------+-------------+-------------+
#|1234|            a|            b|            c|
#+----+-------------+-------------+-------------+

columns=df.columns
columns.remove('id')


df.withColumn("type",concat_ws(",",array(*columns))).drop(*columns).show()
#+----+-----+
#|  id| type|
#+----+-----+
#|1234|a,b,c|
#+----+-----+

更新:

df.show()
#+----+-------------+--------------+-------------+--------------+
#|  id|fields_0_type|fields_0_price|fields_1_type|fields_1_price|
#+----+-------------+--------------+-------------+--------------+
#|1234|            a|            45|            b|            50|
#+----+-------------+--------------+-------------+--------------+

type_cols=[f for f in df.columns if 'type' in f]
price_cols=[f for f in df.columns if 'price' in f]

df.withColumn("type",concat_ws(",",array(*type_cols))).withColumn("price",concat_ws(",",array(*price_cols))).\
drop(*type_cols,*price_cols).\
show()
#+----+----+-----+
#|  id|type|price|
#+----+----+-----+
#|1234| a,b|45,50|
#+----+----+-----+

【讨论】:

  • 您好,已对问题进行了一些更新
猜你喜欢
  • 2020-11-29
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多