使用Spark Dataframe中的函数基于另一列的字符串搜索创建新列

问题描述 投票:0回答:1

我有一个火花数据帧,其中包含一个包含字符串值的列(即'xyztext \ afadfa')。我想创建一个新列,其值为'0'或'1',具体取决于原始列是否包含某些文本(即'text')

结果示例:

## +---+---+------+---------+
## | x1| x2|   x3 | xnew    |
## +---+---+------+---------+
## |  1|  a| xtext|    1    |
## |  3|  B| abcht|    0    |

编辑:我之前尝试过这个(并且现在添加了.cast(int))感谢SGVD,但是当我插入列名时收到'column is not callable'错误:df1 = df.withColumn('Target',df.column 。载有( '文本')。CAST( '诠释'))

到目前为止,我所取得的最好成绩是创建一个0的列:

from pyspark.sql.functions import lit
df1 = df.withColumn('Target', lit(0))

我还尝试了if then else语句来创建向量但是没有运气:

 def targ(string):
     if df.column.contains('text'): return '1'
     else: return '0'
python function text apache-spark dataframe
1个回答
3
投票

Spark列有一个cast方法可以在类型之间进行转换,你可以将一个布尔类型转换为一个整数,其中True被转换为1False被转换为0。在Scala中,您可以使用Column#contains来检查子字符串。 PySpark没有这种方法,但您可以使用instr函数:

import pyspark.sql.functions as F
df1 = df.withColumn('Target', (F.instr(df.column, 'text') > 0).cast('int'))

您还可以将此函数编写为SQL表达式:

df1 = df.withColumn('Target', F.expr("INSTR(column, 'text') > 0").cast('int'))

或者,完全在没有强制转换的SQL中:

df1 = df.withColumn('Target', F.expr("IF(INSTR(column, 'text') > 0, 1, 0)"))
© www.soinside.com 2019 - 2024. All rights reserved.