Я пытаюсь запустить очень простой обратный скрипт geopy, который принимает координату lat-long и возвращает, в частности, страну, штат и город. Все три из них легко извлекаются из объекта ответа JSON. Однако, когда я пытаюсь извлечь функцию «город», я получаю KeyError. Если я дважды проверю, есть ли «город» в объекте ответа, это определенно так (см. Ниже), так что же именно происходит? Я могу без проблем извлечь страну и штат, почему не город? Я также заметил, что это происходит для района и района.
Это мой код:
df = pd.read_csv('data.csv')
geolocator = Nominatim(user_agent='latlongconvert')
df['address'] = df['LastMatchingLatLong'].apply(geolocator.reverse)
df['country'] = df['address'].apply(lambda x: (x.raw['address']['country']))
df['state'] = df['address'].apply(lambda x: (x.raw['address']['state']))
df['city'] = df['address'].apply(lambda x: (x.raw['address']['city']))
Где последняя строка создает следующую ошибку: KeyError: 'city'
Когда я смотрю на конкретную строку, она явно содержит ключ города:
df['address'][0].raw['address']
Ouput:
{'tourism': 'Schwanentempel',
'road': 'Auedamm',
'suburb': 'Südstadt',
'city': 'Kassel',
'municipality': 'Niestetal',
'state': 'Hessen',
'postcode': '34121',
'country': 'Deutschland',
'country_code': 'de'}
Я даже могу использовать df['address'][0].raw['address']['city']
, чтобы извлечь его для этой конкретной строки.
Ах, это всегда что-то простое - я предполагал, что город возвращается для каждой строки, вместо того, чтобы проверять это напрямую. Спасибо, Пол, я постараюсь быть менее идиотом в будущем.
Для всех, у кого есть эта проблема, Geopy не всегда возвращает город, район, район и т. д., поэтому использование лямбда-функции без учета пропущенных значений даст вам ключевую ошибку.
Следующий код решил эту проблему для меня:
df['country'] = df['address'].apply(lambda x: (x.raw['address']['country']))
df['state'] = df['address'].apply(lambda x: (x.raw['address']['state']))
df['city'] = df['address'].apply(lambda x: (x.raw['address']['city'] if 'city' in x.raw['address'].keys() else None ))
Отсутствует ли город для некоторых выходных данных? Это приведет к KeyError?