将regexp_extract和regexp_replace组合起来,以屏蔽pyspark数据帧列中的数字

2024-05-23 21:47:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个PySpark数据帧,df如下所示:

|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|123-45-6789 Broad Street|
|-----|-------|

我的正则表达式模式r"\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}"将向下过滤第2行。然而,我需要掩盖比赛,这必须是一场1:1的比赛。因此,在上面的示例中,更新的值应该是XXX-XX-XXXX Broad Street,而不是X Broad Street。 像这样:

|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|XXX-XX-XXXX Broad Street|
|-----|-------|

我尝试过将regex_replace调用嵌套在regexp_extract调用之上,如下所示:

regexp_replace(regexp_extract(df["address"], "\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}", 0), "\d", "X")

但是,我得到一个错误,它基本上表明我没有将字符串或类似字符串的对象传递给外部regexp_replace函数

有没有一种方法可以组合regexp_replaceregexp_extract函数来就地更新子字符串


Tags: 函数字符串streetappledfindexaddressextract
1条回答
网友
1楼 · 发布于 2024-05-23 21:47:22

试试这种方法

        from pyspark.sql import functions as F

        df = sc.parallelize([
            (1, "123 Apple Street"), (2 ,"123-45-6789 Broad Street")
        ]).toDF(["index", "address"])

        df.show(truncate = False)

      +  -+            +
      |index|address                 |
      +  -+            +
      |1    |123 Apple Street        |
      |2    |123-45-6789 Broad Street|
      +  -+            +

        df2 = df.withColumn("address", F.when(F.col('address').rlike("\d{3}-\d{2}-\d{4}|\d{3} \d{2} \d{4}"), F.regexp_replace(F.col('address'),r'\d','X')).otherwise(F.col('address')))

        df2.show(truncate=False)



        +  -+            +
        |index|address                 |
        +  -+            +
        |1    |123 Apple Street        |
        |2    |XXX-XX-XXXX Broad Street|
        +  -+            +

相关问题 更多 >