You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark中用regexp_extract提取连字符/空格前字符及州信息

解决方案

1. 提取第一个区域(城市/都会区主名)

你的现有代码只能匹配单个单词,没法处理带空格的城市名。咱们可以写个覆盖两种场景的正则:有连字符就取到第一个连字符,没连字符就取到州缩写前面的城市名。

代码如下:

import pyspark.sql.functions as F

hx = hx.withColumn(
    'bls_first_section',
    F.trim(F.regexp_extract(
        hx.bls,
        r'^(.+?)(?:-|,\s*[A-Z]{2}|\s+[A-Z]{2}|$)',
        1
    ))
)

简单说下正则逻辑:

  • ^(.+?):从开头非贪婪抓取内容,避免多抓无关部分
  • 后面的(?:...)是终止条件:碰到第一个-、, 州缩写/ 州缩写,或者到字符串结尾就停止
  • F.trim()用来去掉内容前后可能带的多余空格

2. 提取州信息

给你两种方案,按需选择:

方案一:提取所有州缩写(比如NY-NJ这种两个州都保留)

hx = hx.withColumn(
    'states',
    F.regexp_extract_all(hx.bls, r'\b[A-Z]{2}\b', 0)
)

这个会把所有两位大写的州缩写抓出来,存在数组里。

方案二:提取最后出现的州缩写

hx = hx.withColumn(
    'state',
    F.regexp_extract(
        hx.bls,
        r'[A-Z]{2}(?:\s*Metropolitan.*)?$',
        0
    )
)

这个会跳过后面的Metropolitan后缀,直接抓取最后一个州缩写。

实际处理效果

运行上述代码后,数据会变成如下格式:

idblsbls_first_sectionstatesstate
1New York-White Plains-Wayne NY-NJ Metropolitan DivisionNew York["NY", "NJ"]NJ
2New York-Jersey City-White Plans, NY-NJ Metropolitan DivisionNew York["NY", "NJ"]NJ
3New York-White Plains-Wayne, NY-NJ Metropolitan DivNew York["NY", "NJ"]NJ
4Fayetteville NCFayetteville["NC"]NC
5Fayetteville, NCFayetteville["NC"]NC
6San Antonio, TXSan Antonio["TX"]TX
7San Antonio TXSan Antonio["TX"]TX
8San Antonio-New Braunfels TXSan Antonio["TX"]TX
9San Antonio-New Braunfels, TXSan Antonio["TX"]TX

这样就能把相似名称统一,满足聚合分组前的清洗需求。

内容的提问来源于stack exchange,提问作者kate_programming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:10:29