[英]concatenate list of columns (variable) into one new column dataframe pyspark
[英]Concatenate all pyspark dataframe columns into one string column
我有以下 pyspark dataframe
鉴别 | p1 | p2 | p3 | p4 |
---|---|---|---|---|
1个 | 1个 | 0 | 0 | 1个 |
2个 | 0 | 1个 | 1个 | 0 |
3个 | 0 | 0 | 0 | 1个 |
我想以一种方式连接从 p1 到 p4 的所有列,以这种方式收集 1 和 0 的值
鉴别 | p1 | p2 | p3 | p4 | joined_column |
---|---|---|---|---|---|
1个 | 1个 | 0 | 0 | 1个 | 1001 |
2个 | 0 | 1个 | 1个 | 0 | 0110 |
3个 | 0 | 0 | 0 | 1个 | 0001 |
从 p1 到 p4 的所有列都是 Integer,所以我试图在连接所有列(“标识”列除外)之前将它们转换为字符串,以这种方式:
from pyspark.sql.types import StringType
from pyspark.sql import functions as F
df_concat=df.withColumn('joined_column', F.concat([F.col(c).cast(StringType()) for c in df.columns if c!='identification']))
我收到以下错误:
TypeError: Invalid argument, not a string or column:
是否有任何解决方案或其他方法可以将 pyspark dataframe 的所有列连接成一个字符串?
你必须使用concat_ws
from pyspark.sql.functions import concat_ws
df = df.withColumn('joined_column',concat_ws('',df.p1, df.p2, df.p3, df.p4))
你可以使用下面的代码。 如果您将检查您的架构,这些列中的数据可能不是 integer。您需要将 p1 转换为 p4 为 integer 类型
from pyspark.sql.types import IntegerType
df = df \
.withColumn("p1" , df["p1"].cast(IntegerType())) \
.withColumn("p2", df["p2"].cast(IntegerType())) \
.withColumn("p3" ,df["p3"].cast(IntegerType())) \
.withColumn("p4" , df["p4"] .cast(IntegerType()))
import pyspark
from pyspark.sql import functions as sf
df = df.withColumn('joined_column',sf.concat(sf.col('p1'),sf.col('p2'),sf.col('p3'),sf.col('p4')))
display(df)
我将根据@samkart 评论回答问题。 我们不需要将每一列都转换成字符串,它会在连接时自动转换。
from pyspark.sql import functions as F
df_concat=df.withColumn('joined_column', F.concat(*[F.col(c) for c in df.columns if c!='identification']))
这将独立于列号和名称
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.