首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过正则表达式str.extract()从dataframe中的完整地址列获取邮政编码,并添加为pandas中的新列

通过正则表达式str.extract()从dataframe中的完整地址列获取邮政编码,并添加为pandas中的新列
EN

Stack Overflow用户
提问于 2020-08-13 08:16:11
回答 3查看 847关注 0票数 2

我有一个在列中有完整地址的dataframe,并且我需要在同一个dataframe中创建一个单独的列,其中只包含从7开始的5位数字的邮政编码。某些地址可能是空的,或者找不到邮政编码。

如何拆分该列以仅获取邮政编码?以7开头的邮政编码例如76000是索引0中的邮政编码

代码语言:javascript
运行
复制
MedicalCenters["Postcode"][0]
Location(75, Avenida Corregidora, Centro, Delegación Centro Histórico, Santiago de Querétaro, Municipio de Querétaro, Querétaro, 76000, México, (20.5955795, -100.39274225, 0.0))

示例数据

代码语言:javascript
运行
复制
    Venue         Venue Latitude Venue Longitude Venue Category Address
0 Lab. Corregidora  20.595621   -100.392677      Medical Center Location(75, Avenida Corregidora, Centro, Delegación Centro Histórico, Santiago de Querétaro, Municipio de Querétaro, Querétaro, 76000, México, (20.5955795, -100.39274225, 0.0))

我尝试使用正则表达式,但我得到了和错误

代码语言:javascript
运行
复制
# get zipcode from full address
import re 
MedicalCenters['Postcode'] = MedicalCenters['Address'].str.extract(r'\b\d{5}\b', expand=False) 

错误

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-185-84c21a29d484> in <module>
      1 # get zipcode from full address
      2 import re
----> 3 MedicalCenters['Postcode'] = MedicalCenters['Address'].str.extract(r'\b\d{5}\b', expand=False)

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/strings.py in wrapper(self, *args, **kwargs)
   1950                 )
   1951                 raise TypeError(msg)
-> 1952             return func(self, *args, **kwargs)
   1953 
   1954         wrapper.__name__ = func_name

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/strings.py in extract(self, pat, flags, expand)
   3037     @forbid_nonstring_types(["bytes"])
   3038     def extract(self, pat, flags=0, expand=True):
-> 3039         return str_extract(self, pat, flags=flags, expand=expand)
   3040 
   3041     @copy(str_extractall)

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/strings.py in str_extract(arr, pat, flags, expand)
   1010         return _str_extract_frame(arr._orig, pat, flags=flags)
   1011     else:
-> 1012         result, name = _str_extract_noexpand(arr._parent, pat, flags=flags)
   1013         return arr._wrap_result(result, name=name, expand=expand)
   1014 

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/strings.py in _str_extract_noexpand(arr, pat, flags)
    871 
    872     regex = re.compile(pat, flags=flags)
--> 873     groups_or_na = _groups_or_na_fun(regex)
    874 
    875     if regex.groups == 1:

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/strings.py in _groups_or_na_fun(regex)
    835     """Used in both extract_noexpand and extract_frame"""
    836     if regex.groups == 0:
--> 837         raise ValueError("pattern contains no capture groups")
    838     empty_row = [np.nan] * regex.groups
    839 

ValueError: pattern contains no capture groups

time: 39.5 ms
EN

回答 3

Stack Overflow用户

发布于 2020-08-13 08:53:58

您需要添加括号才能使其成为一个组

代码语言:javascript
运行
复制
MedicalCenters['Address'].str.extract(r"\b(\d{5})\b")
票数 2
EN

Stack Overflow用户

发布于 2020-08-13 08:53:50

您可以先尝试拆分字符串,然后才能更容易地匹配邮政编码:

代码语言:javascript
运行
复制
address = '75, Avenida Corregidora, Centro, Delegación Centro Histórico, Santiago de Querétaro, Municipio de Querétaro, Querétaro, 76000, México, (20.5955795, -100.39274225, 0.0'

matches = list(filter(lambda x: x.startswith('7') and len(x) == 5, address.split(', '))) # ['76000']

因此您可以通过以下方式填充您的DataFrame:

代码语言:javascript
运行
复制
df['postcode'] = df['address'].apply(lambda address: list(filter(lambda x: x.startswith('7') and len(x) == 5, address.split(', ')))[0])
票数 0
EN

Stack Overflow用户

发布于 2020-08-13 10:06:57

地址数据是一个对象,这就是正则表达式无法工作的原因

代码语言:javascript
运行
复制
MedicalCenters.dtypes
Venue               object
Venue Latitude     float64
Venue Longitude    float64
Venue Category      object
Health System       object
geom                object
Address             object
Postcode            object
dtype: object
time: 6.41 ms

将对象转换为字符串后:

代码语言:javascript
运行
复制
MedicalCenters['Address'] = MedicalCenters['Address'].astype('str') 

多亏了glam,我才能应用修改后的正则表达式

代码语言:javascript
运行
复制
# get zipcode from full address
import re 
MedicalCenters['Postcode'] = MedicalCenters['Address'].str.extract(r"\b(\d{5})\b")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63386302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档