簡體   English   中英

使用緯度和經度從 DataFrame 的兩列中獲取地址?

[英]Get address using Latitude and Longitude from two columns in DataFrame?

我有一個帶有經度列和緯度列的 dataframe。 當我嘗試使用geolocator.reverse()獲取地址時,出現錯誤ValueError: Must be a coordinate pair or Point

我這輩子都無法將緯度和經度插入反向 function 而不會出現該錯誤。 我嘗試使用list(zip(zips['Store_latitude'], zips['Store_longitude']))創建一個元組,但我得到了同樣的錯誤。

代碼:

import pandas as pd

from geopy.geocoders import Nominatim

from decimal import Decimal

from geopy.point import Point

zips = pd.read_excel("zips.xlsx")

geolocator = Nominatim(user_agent="geoapiExercises")


zips['Store_latitude']= zips['Store_latitude'].astype(str)

zips['Store_longitude'] = zips['Store_longitude'].astype(str)

zips['Location'] = list(zip(zips['Store_latitude'], zips['Store_longitude']))

zips['Address'] = geolocator.reverse(zips['Location'])

我的 DataFrame 長什么樣

商店_緯度 商店_經度
34.2262225 -118.4508349
34.017667 -118.149135

我認為您可以嘗試使用元組或geopy.point.Point ,然后再轉到列表以查看 package 是否正常工作。

我剛才測試如下(Python 3.9.13,命令行風格)

import geopy
p  = geopy.point.Point(51.4,3.45)
gl = geopy.geocoders.Nominatim(user_agent="my_test") # Without the user_agent it raises a ConfigurationError.
gl.reverse(p)

output: Location(Vlissingen, Zeeland, Nederland, (51.49433865, 3.415005767601362, 0.0))

這符合預期。

也許您應該在轉換為列表之前/之后投射數據框['Store_latitude'] 和數據框['Store_longitude']? 它們不是字符串?

我認為需要有關您的 dataframe 和內容的更多信息以提供進一步幫助。 祝你好運!

編輯:在下面的 OP 評論之后添加了信息。

  1. 當您將 excel 文件讀取為 zips zips = pd.read("yourexcel.xlsx")時,您將獲得 pandas dataframe。

dataframe 的內容是兩列(屬於 Series 類型),每個元素都是 numpy.float64(如果您的 excel 具有真實值作為輸入而不是字符串。):您可以使用 type() 命令進行檢查:

>>> type(zips)
<class 'pandas.core.frame.DataFrame'>
>>> type(zips['Lat'])
<class 'pandas.core.series.Series'>
>>> type(zips['Lat'][0])
<class 'numpy.float64'>

然后您要做的是通過執行zips[...] = zips[...].astype(str) 沒有理由這樣做,因為您的地理定位器需要數字,而不是文本。

  1. 如@Derek 的評論所示,您需要遍歷每一行,同時這樣做,您可以將從地理定位器收到的結果位置放在新列中。

所以在下一個塊中,我首先創建一個新的(空)列表。 然后我通過使用 zip 命令組合你的 zips['Lat'] 和 zips['lon'] 來迭代幾個緯度,經度(所以如果你不知道 zip 命令,那么 zips 的命名有點不吉利;它因此可能會讓你感到困惑)。 但別擔心,它所做的只是組合變量 lat 和 lon 中每一行的條目。 在 for-each 循環中,我 append 地理定位器查找的結果。 請注意,reverse 命令的參數是一個元組 (lat,lon),因此完整的語法是 reverse((lat,lon))。 除了 (lat,lon),您還可以像我原來的示例中那樣創建一個點。 但這不是必要的。 (注意:為簡潔起見,我只寫了“Lat”和“Lon”,而不是你的商店......)。 最后,將結果列表分配為您的 zip pandas dataframe 中的新列。

import geopy as gp
# instiate a geolocator
gl = gp.geocoders.Nominatim(user_agent="my_test")

locations = []    # Create empty list

# For loop over each couple of lat, lon
for lat,lon in zip(zips['Lat'], zips['Lon']):
    locations.append(gl.reverse((lat,lon))

# Add extra column to your pandas table (address will be the column name)
zips = zips.assign(address=locations) 

您仍然可能想要的一件事是,在您的表中只包含文本字符串而不是完整的 geopy.Location() 字符串。 為此,您需要對 for 循環進行少量修改([0] 作為 Location 對象的第一個元素)。 請注意,如果給定行的查找結果為空(無),這將不起作用。 然后 [0] 將引發錯誤。

# For loop over each couple of lat, lon
for lat,lon in zip(zips['Lat'], zips['Lon']:
    locations.append(gl.reverse((lat,lon)[0])

我希望這能讓你前進!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM