在 pandas 数据框上迭代地理定位

Iterate geolocation over pandas dataframe

我有一个包含两列的数据框,医院名称和地址,我想遍历每个地址以查找纬度和经度。我的代码似乎占据了数据框中的第一行,我似乎无法 select 地址来找到坐标。

import pandas
from geopy.geocoders import Nominatim

geolocator = Nominatim()
for index, item in df.iterrows():
    location = geolocator.geocode(item)
    df["Latitude"].append(location.latitude)
    df["Longitude"].append(location.longitude)

这是我用来抓取网站的代码。复制并 运行 这个,你就会得到数据集。

import requests
from bs4 import BeautifulSoup
import pandas
import numpy as np

r=requests.get("https://www.privatehealth.co.uk/hospitals-and-
clinics/orthopaedic-surgery/?offset=300")
c=r.content
soup=BeautifulSoup(c,"html.parser")
all=soup.find_all(["div"],{"class":"col-9"})
names = []
for item in all:
    d={}
    d["Hospital Name"] = item.find(["h3"],{"class":"mb6"}).text.replace("\n","")
    d["Address"] = item.find(["p"],{"class":"mb6"}).text.replace("\n","")
    names.append(d)
df=pandas.DataFrame(names)
df = df[['Hospital Name','Address']]
df

目前数据看起来像(一个医院的例子):

Hospital Name   |Address         
Fulwood Hospital|Preston, PR2 9SZ

我试图实现的最终输出看起来像这样。

Hospital Name   |Address         | Latitude | Longitude
Fulwood Hospital|Preston, PR2 9SZ|53.7589938|-2.7051618

这里似乎有一些问题。使用您提供的 URL 中的数据:

df.head()
                                Hospital Name                   Address
0                        Fortius Clinic City           London, EC4N 7BE
1  Pinehill Hospital - Ramsay Health Care UK           Hitchin, SG4 9QZ
2                  Spire Montefiore Hospital              Hove, BN3 1RD
3             Chelsea & Westminster Hospital           London, SW10 9NH
4   Nuffield Health Tunbridge Wells Hospital   Tunbridge Wells, TN2 4UL

(1) 如果你的数据框列名真的是Hospital nameAddress,那么你需要在致电 geocode().
只需使用 item 即可同时获得 Hospital nameAddress

for index, item in df.iterrows():
    print(f"index: {index}")
    print(f"item: {item}")
    print(f"item.Address only: {item.Address}")

# Output:
index: 0

item: Hospital Name    Fortius Clinic City 
Address              London, EC4N 7BE
Name: 0, dtype: object

item.Address only: London, EC4N 7BE
...

(2) 您注意到您的数据框只有两列。如果这是真的,当您尝试对 df["Latitude"]df["Longitude"] 执行操作时,您将得到 KeyError,因为它们不存在。

(3)Address 列上使用 apply() 可能比 iterrows().
更清楚 请注意,这是一个文体点,值得商榷。 (前两点是实际错误。)

例如,使用提供的 URL:

from geopy.geocoders import Nominatim
geolocator = Nominatim()

tmp = df.head().copy()

latlon = tmp.Address.apply(lambda addr: geolocator.geocode(addr))

tmp["Latitude"] = [x.latitude for x in latlon]
tmp["Longitude"] = [x.longitude for x in latlon]

输出:

                                Hospital Name                   Address  \
0                        Fortius Clinic City           London, EC4N 7BE   
1  Pinehill Hospital - Ramsay Health Care UK           Hitchin, SG4 9QZ   
2                  Spire Montefiore Hospital              Hove, BN3 1RD   
3             Chelsea & Westminster Hospital           London, SW10 9NH   
4   Nuffield Health Tunbridge Wells Hospital   Tunbridge Wells, TN2 4UL   

    Latitude  Longitude  
0  51.507322  -0.127647  
1  51.946413  -0.279165  
2  50.840871  -0.180561  
3  51.507322  -0.127647  
4  51.131528   0.278068