从Pandas数据框上的坐标列进行反向地理编码

问题描述

我有一个Pandas数据框,其中包含描述不同位置的几列属性。让我们将数据帧称为df,该数据帧具有一列location_tuple,其中包含df中每一行的(纬度,经度)坐标值的元组。我现在想在df中创建一个新列,其中包含df中每个位置的城市名称,并且想知道是否有人可以建议一种简便的方法来实现此目的。

我可以使用geopy包获取df中给定行的城市名称。从Nominatim导入geopy.geocoders并将地理定位器对象创建geolocator = Nominatim(user_agent="myapp"),通过键入

,我可以得到零行坐标的城市名称
geolocator.reverse(df.location_tuple[0]).raw['address']['city']

但是我找不到实现此方法的新方法,以获取数据框中所有行的城市名称新列。我希望对此有所帮助。

非常感谢!

解决方法

您需要一个lambda表达式来描述从city获取location_tuple的整个过程。

lambda el: geolocator.reverse(el).raw["address"]["city"]

将其插入list(map())df.apply()即可。

df["city"] = list(map(lambda el: geolocator.reverse(el).raw["address"]["city"],df["location_tuple"]))
df["city"] = df["location_tuple"].apply(lambda el: geolocator.reverse(el).raw["address"]["city"])

代码 :(请在下一次提供示例数据以方便助手)

from geopy.geocoders import Nominatim
import pandas as pd

df = pd.DataFrame(data={
    "location_tuple": [
        (25.0330,121.5654),# Taipei
        (52.3676,4.9041)  # Amsterdam
    ]
})

geolocator = Nominatim(user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/83.0.4103.116 Safari/537.36",timeout=3)

df["city"] = list(map(lambda el: geolocator.reverse(el).raw["address"]["city"],df["location_tuple"]))
# alternative
# df["city"] = df["location_tuple"].apply(lambda el: geolocator.reverse(el).raw["address"]["city"])

输出

df
Out[16]: 
       location_tuple       city
0  (25.033,121.5654)        臺北市
1   (52.3676,4.9041)  Amsterdam

还可以考虑在language="en"中添加geolocator.reverse(),以便城市名称变为英语。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...