如何从pandas DataFrame的地址栏中提取英国邮政编码?

我有一个包含信息的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,PT7 6WA
5   1654   46,The Clewter,Great Durham,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})$')

提取邮政编码,但这似乎不可行,并给出了9个参数的错误,给出了应该取1的位置。

我也尝试过:

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,Kent TN5 4NP   TN5 4NP
1   1205   154 Coller Crescent Runcorn,Cheshire WP6 4TY       WP6 4TY
2   1504   122 Uphill Road,Essex SF6 9VT            SF6 9VT
3   1678   67 Lampoon Crescent,CM52 0QY   CM52 0QY
4   1897   32 Dovelane,PT7 6WA               PT7 6WA
5   1654   46,CD7 9HE       CD7 9HE

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

    col1   col2                                              col3 (coords)
0   1303   674 Yellow Gardens,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,Essex SF6 9VT            54.65,1.07
3   1678   67 Lampoon Crescent,CM52 0QY    51.23,0.95
4   1897   32 Dovelane,PT7 6WA               54.6,2.23
5   1654   46,CD7 9HE       49.25,1.23

我们将不胜感激,或者将任何帮助指向正确的方向。

谢谢

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

iCMS 回答:如何从pandas DataFrame的地址栏中提取英国邮政编码?

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

Adress =“黄色花园,Tunbridge井,肯特TN5 4NP”

Adresslist = Adress.split()

邮政编码=地址列表[len(地址列表)-1] +“” +地址列表[len(地址列表)]

,

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

,

尝试使用邮政: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',('tunbridge wells',('kent',('tn5 4np','postcode')]

此外,我认为它将对真实数据更好地工作。

本文链接:https://www.f2er.com/2229805.html

大家都在问