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后缀,直接抓取最后一个州缩写。
实际处理效果
运行上述代码后,数据会变成如下格式:
| id | bls | bls_first_section | states | state |
|---|---|---|---|---|
| 1 | New York-White Plains-Wayne NY-NJ Metropolitan Division | New York | ["NY", "NJ"] | NJ |
| 2 | New York-Jersey City-White Plans, NY-NJ Metropolitan Division | New York | ["NY", "NJ"] | NJ |
| 3 | New York-White Plains-Wayne, NY-NJ Metropolitan Div | New York | ["NY", "NJ"] | NJ |
| 4 | Fayetteville NC | Fayetteville | ["NC"] | NC |
| 5 | Fayetteville, NC | Fayetteville | ["NC"] | NC |
| 6 | San Antonio, TX | San Antonio | ["TX"] | TX |
| 7 | San Antonio TX | San Antonio | ["TX"] | TX |
| 8 | San Antonio-New Braunfels TX | San Antonio | ["TX"] | TX |
| 9 | San Antonio-New Braunfels, TX | San Antonio | ["TX"] | TX |
这样就能把相似名称统一,满足聚合分组前的清洗需求。
内容的提问来源于stack exchange,提问作者kate_programming
相关产品推荐
相关产品推荐

