使用Pyspark连接DataFrame的多个列

7

假设我有一列列名,例如:

col_list = ['col1','col2']
df = spark.read.json(path_to_file)
print(df.columns)
# ['col1','col2','col3']

我需要通过连接col1col2来创建一个新列。我不想在连接时硬编码列名称,而是需要从列表中选择。
如何做到这一点?
1个回答

26

您可以使用pyspark.sql.functions.concat()函数将您在list中指定的所有列连接起来。只需将它们作为参数传递。

from pyspark.sql.functions import concat
# Creating an example DataFrame
values = [('A1',11,'A3','A4'),('B1',22,'B3','B4'),('C1',33,'C3','C4')]
df = sqlContext.createDataFrame(values,['col1','col2','col3','col4'])
df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|  A1|  11|  A3|  A4|
|  B1|  22|  B3|  B4|
|  C1|  33|  C3|  C4|
+----+----+----+----+

concat()函数中,您需要传递需要连接的所有列 - 如concat('col1','col2')。如果您有一个列表,可以使用*将其解除列表形式。(*['col1','col2'])因此返回('col1','col2')

col_list = ['col1','col2']
df = df.withColumn('concatenated_cols',concat(*col_list))
df.show()
+----+----+----+----+-----------------+
|col1|col2|col3|col4|concatenated_cols|
+----+----+----+----+-----------------+
|  A1|  11|  A3|  A4|             A111|
|  B1|  22|  B3|  B4|             B122|
|  C1|  33|  C3|  C4|             C133|
+----+----+----+----+-----------------+

我们可以在中间加一个分隔符吗? - G.v. Sridhar
@G.v.Sridhar 你可以使用类似这样的语句 concat(col("a"), lit(" "), col("b")),在 lit() 中你可以放置你的分隔符。 - badger
6
如果您想要一个分隔符,可以使用concat_ws函数,像这样(*是分隔符):df = df.withColumn('concatenated_cols',concat_ws('*',*col_list)) - Rich Dudley
当我使用concat_ws(",", *col_list)时,它返回"_1"作为列标题,而不是"concatenated_cols",并且值变成了Row(concatenated_cols='A1,11,A3,A4) .. 我该如何解决这个问题? - Sudhir Jangam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接