我有一个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})$')
来提取邮编,但似乎行不通 出现了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'}))
从这里..: 如何在字符串中合并pandas? 但它在我的机器上运行需要很长时间,因为在第二个数据框架中有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
任何帮助将被感激或被指出在正确的方向。
谢谢你的帮助
* 地址已被更改,所以不是真实的,但格式是一样的。
如果你总是需要最后2个值,通过使用split将字符串转换为列表,并在列表中取最后两个值。
地址="Yellow Gardens,Tunbridge Wells, Kent TN5 4NP"
Adresslist=Adress.split()
Zip = Adresslist[len(Adresslist)-1]+" "+ Adresslist[len(Adresslist)]。
我不知道你的数据有多不规则,也不知道你对篡改的容忍度有多高,但是面对相当混乱的地址数据,有时候你需要一些横向思维。可以考虑使用google地图API,把地址扔到它那里,然后用谷歌的所有智慧把清理过的数据拿回来。对于1.7米的地址,你要付出一点代价,每天免费的配额是相当少的。
尽量用邮政。https:/github.comopenvenuespypostal。
它是一个用于解析地址的开源库。
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')]
另外我认为用真实的数据会更好。