问题描述
我有一个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()
,以便城市名称变为英语。