Pyspark 中的条件字符串操作

Posted

技术标签:

【中文标题】Pyspark 中的条件字符串操作【英文标题】:Conditional string manipulation in Pyspark 【发布时间】:2020-10-29 08:43:21 【问题描述】:

我有一个 Pyspark 数据框,其中包括一列 MSN(字符串类型),如下所示:

+------+
| Col1 |
+------+
| 654- |
| 1859 |
| 5875 |
| 784- |
| 596- |
| 668- |
| 1075 |
+------+

如您所见,那些值小于 1000(即三个字符)的条目末尾有一个 - 字符,总共有 4 个字符。

我想摆脱那个- 字符,所以我最终会得到类似的东西:

+------+
| Col2 |
+------+
| 654  |
| 1859 |
| 5875 |
| 784  |
| 596  |
| 668  |
| 1075 |
+------+

我尝试了以下代码(其中df 是包含该列的数据框,但它似乎不起作用:

if df.Col1[3] == "-":
        df = df.withColumn('Col2', df.series.substr(1, 3))
        return df
else:
        return df

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

您可以使用 F.regexp_replace 将列中的 - 替换为空字符串 ("")

请看下面的代码,

df.withColumn("Col2", F.regexp_replace("Col1", "-", "")).show()

+----+----+
|Col1|Col2|
+----+----+
|589-| 589|
|1245|1245|
|145-| 145|
+----+----+

【讨论】:

【参考方案2】:

这是使用.substr() 方法的解决方案:

df.withColumn("Col2", F.when(F.col("Col1").substr(4, 1) == "-", 
                             F.col("Col1").substr(1, 3)
                      ).otherwise(
                             F.col("Col1"))).show()

+----+----+
|Col1|Col2|
+----+----+
|654-| 654|
|1859|1859|
|5875|5875|
|784-| 784|
|596-| 596|
|668-| 668|
|1075|1075|
+----+----+

【讨论】:

以上是关于Pyspark 中的条件字符串操作的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:使用转换类型作为字符串的多重连接条件

pyspark中列名的字符串操作

pyspark 用字符串中的空格分割 csv - jupyter notebook

在 PySpark 中的窗口上获取与某些条件匹配的第一行

PySpark:TypeError:条件应该是字符串或列

pyspark 数据框“条件应该是字符串或列”