【问题标题】:How to extract UK postcodes from an address column in a pandas DataFrame?如何从 pandas DataFrame 中的地址列中提取英国邮政编码?
【发布时间】:2020-09-19 12:56:57
【问题描述】:

我有一个包含信息的 DataFrame,特别是像下面的 DataFrame 这样的地址:

    col1   col2
0   1303   674 Yellow Gardens,Tunbridge Wells, Kent TN5 4NP
1   1205   154 Coller Crescent Runcorn,Cheshire WP6 4TY
2   1504   122 Uphill Road,Rayleigh, Essex SF6 9VT
3   1678   67 Lampoon Crescent,Billericay, Essex, CM52 0QY
4   1897   32 Dovelane,Benfleet, Essex, PT7 6WA
5   1654   46, The Clewter,Great Durham, Essex, CD7 9HE

这些都是不同的格式,有些有逗号,有些没有,还有来自其他国家的地址示例。我想知道如何从这里提取地址,因为我想将它们与位置数据合并。

这可能意味着合并子字符串或仅提取

我试过了:

df["postcodes"] = df["address"].str.extract(r'^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$')

提取邮政编码,但这似乎不起作用,因为给出了应该取 1 的 9 个参数的错误。

我也尝试过:

rhs = (df1.address
          .apply(lambda x: df2[df2.Postcode.str.find(x).ge(0)]['location'])
          .bfill(axis=1)
          .iloc[:, 0])

(pd.concat([df1.app_nbr, rhs], axis=1, ignore_index=True)
 .rename(columns={0: 'app_nbr', 1: 'location'}))

从这里开始:How to merge pandas on string contains? 但鉴于第二个数据帧中有 170 万个邮政编码要匹配,因此在我的机器上运行需要很长时间。

预期的输出将是:

    col1   col2                                                  col3
0   1303   674 Yellow Gardens,Tunbridge Wells, Kent TN5 4NP   TN5 4NP
1   1205   154 Coller Crescent Runcorn,Cheshire WP6 4TY       WP6 4TY
2   1504   122 Uphill Road,Rayleigh, Essex SF6 9VT            SF6 9VT
3   1678   67 Lampoon Crescent,Billericay, Essex, CM52 0QY   CM52 0QY
4   1897   32 Dovelane,Benfleet, Essex, PT7 6WA               PT7 6WA
5   1654   46, The Clewter,Great Durham, Essex, CD7 9HE       CD7 9HE

或者(根据邮政编码匹配第二个数据框):

    col1   col2                                              col3 (coords)
0   1303   674 Yellow Gardens,Tunbridge Wells, Kent TN5 4NP   50.00, 1.00
1   1205   154 Coller Crescent Runcorn,Cheshire WP6 4TY       51.23, 1.05
2   1504   122 Uphill Road,Rayleigh, Essex SF6 9VT            54.65, 1.07
3   1678   67 Lampoon Crescent,Billericay, Essex, CM52 0QY    51.23, 0.95
4   1897   32 Dovelane,Benfleet, Essex, PT7 6WA               54.6,  2.23
5   1654   46, The Clewter,Great Durham, Essex, CD7 9HE       49.25, 1.23

任何帮助将不胜感激或指出正确的方向。

谢谢

*地址已更改,因此不是真实的,但格式相同

【问题讨论】:

  • 请发布您的预期输出

标签: python pandas dataframe postal-code


【解决方案1】:

如果您总是需要最后两个值,请使用 split 将字符串转换为列表,并获取列表中的最后两个值。

Adress="Yellow Gardens,Tunbridge Wells, Kent TN5 4NP"

地址列表=地址.split()

Zip = Adresslist[len(Adresslist)-1]+" "+ Adresslist[len(Adresslist)]

【讨论】:

  • 不幸的是,它们并不都在最后两个值中,有很多不规则的值(抱歉应该指定)
【解决方案2】:

我不知道您的数据有多不规则以及您对摆弄的容忍度如何,但是面对非常混乱的地址数据,有时您需要一些横向思考。考虑使用 google maps API,将地址扔给它,然后使用 Google 的所有智能取回已清理的数据。对于 170 万个地址,您需要支付一些费用,每日免费配额非常少。

【讨论】:

  • 嗨蒂姆,我已经考虑过了,但由于超出每日配额后的成本,我没有办法使用谷歌地理编码 API 来遍历所有地址。跨度>
【解决方案3】:

尝试使用邮政:https://github.com/openvenues/pypostal

这是一个用于解析地址的开源库

In [1]: from postal.parser import parse_address

In [2]: parse_address("Coller Crescent Runcorn,Cheshire WP6 4TY")
Out[2]:
[('coller crescent', 'road'),
 ('runcorn', 'city'),
 ('cheshire', 'state_district'),
 ('wp6 4ty', 'postcode')]

In [3]: parse_address("Yellow Gardens,Tunbridge Wells, Kent TN5 4NP")
Out[3]:
[('yellow gardens', 'road'),
 ('tunbridge wells', 'city'),
 ('kent', 'state_district'),
 ('tn5 4np', 'postcode')]

而且我认为它会更好地处理真实数据。

【讨论】:

  • 嗨 Sylwek,你知道我将如何将其应用于数据框吗?
  • @Sylwek_Brzeczkowski 这是一个答案的开始,但问题是关于在pandas 中使用pypostal 所以你还没有完全做到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多