gpt4 book ai didi

python - 如何在 Array 上使用

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:22 25 4
gpt4 key购买 nike

我有一个 pyspark 数据框,它包含 4 列。我想从一列中提取一些字符串,它的类型是 Array of strings。我使用了 regexp_extract 函数,但它返回了一个错误,因为 regexp_extract 只接受一个字符串。

示例数据框:

id |  last_name | age | Identificator
------------------------------------------------------------------
12 | AA | 23 | "[""AZE","POI","76759","T86420","ADAPT"]"
------------------------------------------------------------------
24 | BB | 24 | "[""SDN","34","35","AZE","21054","20126"]"
------------------------------------------------------------------

我想提取所有数字:

- contain 4, 5 or 6 digits
- it should not attached to a letters.
- if attached to letter Z ok, I should extract it.
- save it in a new column in my Dataframe.

我开始这样做,但它不起作用,因为标题是一个字符串数组。

expression = r'([0-9]){4,6}'
df = df.withColumn("extract", F.regexp_extract(F.col("Identificator"), expression, 1))

如何使用 regexp_extract 或其他解决方案提取这些数字? 谢谢

最佳答案

这是我使用 SparkSQL 2.4.0+ 内置函数可以做的 filter :

from pyspark.sql.functions import expr

df.withColumn('text_new', expr('filter(text, x -> x rlike "^Z?[0-9]{4,6}$")')) \
.show(truncate=False)
#+-----------------------------------+---------------------+
#|text |text_new |
#+-----------------------------------+---------------------+
#|[AZE, POI, 76759, T86420, ADAPT] |[76759] |
#|[SDN, 34, Z8735, AZE, 21054, 20126]|[Z8735, 21054, 20126]|
#+-----------------------------------+---------------------+

结果是一个包含匹配项的数组。正则表达式 ^Z?[0-9]{4,6}$ 匹配 4-6 位数字,可选地在前面加上字符“Z”。

编辑:对于旧版本的 Apache Spark,使用 udf():

import re
from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, StringType

# regex pattern:
ptn = re.compile('^Z?[0-9]{4,6}$')

# create an udf to filter array
array_filter = udf(lambda arr: [ x for x in arr if re.match(ptn, x) ] if type(arr) is list else arr, ArrayType(StringType()))

df.withColumn('text_new', array_filter('text')) \
.show(truncate=False)

Edit-2:根据您的评论,从“Z”到“MOD”并删除前导 MOD,使用 lstrip() 删除此子字符串。调整以下内容:

ptn = re.complie(r'^(?:MOD)?[0-9]{4,6}$')

array_filter = udf(lambda arr: [ x.lstrip('MOD') for x in arr if re.match(ptn, x) ] if type(arr) is list else arr, ArrayType(StringType()))

关于python - 如何在 Array 上使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58374905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com