繁体   English   中英

将所有 pyspark dataframe 列连接成一个字符串列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM