如何从pandas数据帧的列中提取城市、州?

2024-05-23 13:17:38 发布

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

我正在处理原始数据,并试图从地址列中提取城市、州。在

Address
xxx Richardson, TX
yyy Plano, TX
xxyy Wylie, TX WO-65758
zzz Waxahachie, TX WO-999786

我使用了拆分列中的最后两个元素,但是如何处理像第3行和第4行这样的包含3万条记录的大型数据集中的数据?在


Tags: 数据元素原始数据address地址richardsonxxxtx
3条回答

选项1:逗号拆分

它是否可以简单到用逗号拆分字符串,然后在拆分后使用最后一个标记/第一个标记?在

addresses = ["xxx Richardson, TX", "xxyy Wylie, TX WO-65758"]
for a in addresses:
    asplit = a.split(",")
    city = asplit[0].split()[-1]
    state = asplit[1].split()[0]
    print(", ".join([city, state]))
#Richardson, TX
#Wylie, TX

示例

如果您有以下数据帧:

^{pr2}$

您可以定义拆分函数:

^{3}$

然后apply()返回address列,这将返回两个新列,join()返回原始数据帧:

df.join(
    df['Address'].apply(
        lambda x: pd.Series(extract_city_state(x), index=["City", "State"])
    )
)
#                        Address        City State
#0            xxx Richardson, TX  Richardson    TX
#1                 yyy Plano, TX       Plano    TX
#2       xxyy Wylie, TX WO-65758       Wylie    TX
#3  zzz Waxahachie, TX WO-999786  Waxahachie    TX

选项2:使用正则表达式

如果这不起作用,那么使用regex模式进行匹配怎么样?在

这个应该有用:

import re    
pattern = r"[A-Z][a-z]+,\s[A-Z]{2}"
for a in addresses:
  matches = re.finditer(pattern, a, re.MULTILINE)
  for match in matches:
      city, state = match.group().replace(",", "").split()
      print(", ".join([city, state])) 
#Richardson, TX
#Wylie, TX

哪一个匹配:

  • [A-Z]:一个大写字母
  • [a-z]+:任意数量的小写字母
  • ,\s:逗号后跟空格
  • [A-Z]{2}:2个大写字母

Demo on Regex101


示例

df.join(
    df['Address'].str.extract(
        r"((?P<City>[A-Z][a-z]+),\s(?P<State>[A-Z]{2}))",
        expand=False
    )[["City", "State"]]
)
#                        Address        City State
#0            xxx Richardson, TX  Richardson    TX
#1                 yyy Plano, TX       Plano    TX
#2       xxyy Wylie, TX WO-65758       Wylie    TX
#3  zzz Waxahachie, TX WO-999786  Waxahachie    TX

注意事项

  • 这不适用于有空格的城市名称,例如“德克萨斯州圣安东尼奥”。在

我不太明白您想要得到什么,只需将列分开,得到最后两个元素,即城市和州?也许下面的代码可以帮助你。在

df["Address"].apply(lambda x: "".join(x.split()[1:]))

update:(我更改了第2行的数据,使其包含空格)

^{pr2}$

结果:

^{3}$

与其重新设计轮子,不如考虑使用现有的地址解析库。有不止一个,所以你可能需要做一些比较。https://github.com/datamade/usaddress是我过去用过的。在

相关问题 更多 >