![](/img/trans.png)
[英]How separate latitude and longitude into two columns from dataframe using regex
[英]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 評論之后添加了信息。
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)
。 沒有理由這樣做,因為您的地理定位器需要數字,而不是文本。
所以在下一個塊中,我首先創建一個新的(空)列表。 然后我通過使用 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.