Python :反向地理编码以获取 pandas 中的城市名称和州名称

Python : Reverse Geocoding to get city name and state name in pandas

我有一个带有纬度和经度的大型数据集,我想在它们前面绘制城市和州的地图。我使用的方法是这样的:

import pandas as pd
import reverse_geocoder as rg 
import pprint 

df = pd.read_csv("D:\data.csv")
def reverseGeocode(coordinates): 
    result = rg.search(coordinates)
    # result is a list containing ordered dictionary. 
    pprint.pprint(result)  

# Driver function 
if __name__=="__main__": 

    # Coordinates tuple.Can contain more than one pair.
    for i in range(2):
        coordinates =(df['latitude'][i],df['longitude'][i])
        reverseGeocode(coordinates)

输出:

[OrderedDict([('lat', '13.322'),
              ('lon', '75.774'),
              ('name', 'Chikmagalur'),
              ('admin1', 'Karnataka'),
              ('admin2', 'Chikmagalur'),
              ('cc', 'IN')])]
[OrderedDict([('lat', '18.083'),
              ('lon', '73.416'),
              ('name', 'Mahad'),
              ('admin1', 'Maharashtra'),
              ('admin2', 'Raigarh'),
              ('cc', 'IN')])]

我想做的是-



    id  latitude    longitude   name    admin2  admin1
0   23  13.28637    75.78518
1   29  17.90387    73.43351
2   34  15.72967    74.49182
3   48  20.83830    73.26416
4   54  21.93931    75.13398
5   71  20.92673    75.32402
6   78  19.26049    73.38982
7   108 17.90468    73.43486
8   109 13.28637    75.78518
9   113 15.72934    74.49189
10  126 20.83830    73.26417
11  131 21.93930    75.13399
12  146 20.92672    75.32402
13  152 19.26049    73.38982
14  171 17.90657    73.43382

在 ["latitude","longitude"]

前面的数据框 (df) 中映射名称 admin1 和 admin2

方法如下:

if __name__=="__main__": 

    df = pd.Dataframe(columns = ['latitude','longitude'])
    # Coordinates tuple.Can contain more than one pair.
    for i in range(2):
        coordinates =(df['latitude'][i],df['longitude'][i])
        res = reverseGeocode(coordinates)
        lat = res[0]['lat']
        long = res[0]['lon']
        df = df.append([{ 'latitude': lat, 'longitude': long}])

虽然其他解决方案可能有效,但您可以找到更优雅的解决方案:

import pandas as pd
import reverse_geocoder as rg 
import pprint 

df = pd.read_csv("data.csv")

def reverseGeocode(coordinates): 
    result = rg.search(coordinates)
    return (result)

if __name__=="__main__": 

    # Coordinates tuple.Can contain more than one pair.
    coordinates =list(zip(df['latitude'],df['longitude'])) # generates pair of (lat,long)
    data = reverseGeocode(coordinates)

    df['name'] = [i['name'] for i in data]
    df['admin1'] = [i['admin1'] for i in data]
    df['admin2'] = [i['admin2'] for i in data]

df.to_csv("data_appended.csv") # write to csv # result will be saved to data_appended.csv