У меня есть фрейм данных Pandas, и я вызывал API Карт Google в каждой ячейке адреса, чтобы получить больше данных, основанных на местоположении, используя apply
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key='AIzaSyBlNIvZTk-BpWDeX1FFXPbx6QwbNzZL80w', timeout=5)
location1 = test_df['address_original'].apply(geolocator.geocode)
location2 = location1.apply(lambda loc: loc.raw if loc else None)
print location2
0 {u'geometry': {u'location_type': u'ROOFTOP', u...
1 {u'geometry': {u'location': {u'lat': 51.217491...
2 {u'geometry': {u'location': {u'lat': 51.308421...
3 {u'geometry': {u'location_type': u'APPROXIMATE...
4 {u'geometry': {u'location_type': u'GEOMETRIC_C...
5 {u'geometry': {u'location': {u'lat': 51.587061...
6 {u'geometry': {u'location_type': u'GEOMETRIC_C...
7 {u'geometry': {u'location': {u'lat': 50.901207...
8 {u'geometry': {u'location': {u'lat': 51.647805...
9 {u'geometry': {u'location': {u'lat': 50.640587...
10 {u'geometry': {u'location': {u'lat': 50.651339...
В каждой ячейке возвращается объект словаря
print location2[0]
{u'geometry': {u'location_type': u'ROOFTOP', u'bounds': {u'northeast': {u'lat': 52.11653860000001, u'lng': -106.6477325}, u'southwest': {u'lat': 52.1164591, u'lng': -106.6478363}}, u'viewport': {u'northeast': {u'lat': 52.1178478302915, u'lng': -106.6464354197085}, u'southwest': {u'lat': 52.1151498697085, u'lng': -106.6491333802915}}, u'location': {u'lat': 52.1165023, u'lng': -106.6477809}}, u'address_components': [{u'long_name': u'908', u'types': [u'street_number'], u'short_name': u'908'}, {u'long_name': u'Main Street', u'types': [u'route'], u'short_name': u'Main St'}, {u'long_name': u'Nutana', u'types': [u'neighborhood', u'political'], u'short_name': u'Nutana'}, {u'long_name': u'Saskatoon', u'types': [u'locality', u'political'], u'short_name': u'Saskatoon'}, {u'long_name': u'Division No. 11', u'types': [u'administrative_area_level_2', u'political'], u'short_name': u'Division No. 11'}, {u'long_name': u'Saskatchewan', u'types': [u'administrative_area_level_1', u'political'], u'short_name': u'SK'}, {u'long_name': u'Canada', u'types': [u'country', u'political'], u'short_name': u'CA'}, {u'long_name': u'S7H 0K5', u'types': [u'postal_code'], u'short_name': u'S7H 0K5'}], u'place_id': u'ChIJsxCU4S3xBFMROWgVYKfOkko', u'formatted_address': u'908 Main St, Saskatoon, SK S7H 0K5, Canada', u'types': [u'premise']}
Я планирую отфильтровывать различные фрагменты данных и помещать их каждый в свои столбцы Pandas.Для этого я создал цикл for
tempCol = []
for dataPiece in location2:
try:
for item in dataPiece['address_components']:
if item['types'] == ['locality', 'political']:
print item['long_name']
tempCol.append(item['long_name'])
except:
print 'No data'
tempCol.append('None')
Saskatoon
Little Fort
Clinton
Johnson Lake
Edinburgh
Clearwater
Karachi
Blind Bay
Clearwater
. Он выводит список городов, которые обычно помечаются как населенные пункты, политические в API Карт Google.Хотя есть ошибка, потому что для ячеек, у которых нет этих тегов, ничего не возвращается, и поэтому мой список location2 короче длины столбца панд.
Это пример результата API Google, который не дает никакого ответа от цикла, потому что он не имеет местоположения, политического ключа:
{u'geometry': {u'location_type': u'GEOMETRIC_CENTER', u'bounds': {u'northeast': {u'lat': 55.9375528, u'lng': -3.1831058}, u'southwest': {u'lat': 55.93223440000001, u'lng': -3.1885178}}, u'viewport': {u'northeast': {u'lat': 55.9375528, u'lng': -3.1831058}, u'southwest': {u'lat': 55.93223440000001, u'lng': -3.1885178}}, u'location': {u'lat': 55.9347423, u'lng': -3.1867772}}, u'formatted_address': u'Lauder Rd, Edinburgh EH9, UK', u'place_id': u'ChIJJfqkc3nHh0gRF64Imw-sw-U', u'address_components': [{u'long_name': u'Lauder Road', u'types': [u'route'], u'short_name': u'Lauder Rd'}, {u'long_name': u'Edinburgh', u'types': [u'postal_town'], u'short_name': u'Edinburgh'}, {u'long_name': u'Edinburgh', u'types': [u'administrative_area_level_2', u'political'], u'short_name': u'Edinburgh'}, {u'long_name': u'Scotland', u'types': [u'administrative_area_level_1', u'political'], u'short_name': u'Scotland'}, {u'long_name': u'United Kingdom', u'types': [u'country', u'political'], u'short_name': u'GB'}, {u'long_name': u'EH9', u'types': [u'postal_code', u'postal_code_prefix'], u'short_name': u'EH9'}], u'partial_match': True, u'types': [u'route']}
В этих случаях яхотел бы, чтобы возвращение было None, но у меня возникли проблемы, потому что, если добавить оператор else None, он возвращает None для каждого ключа в словаре.
Любая помощь будет оценена.
Кроме того, я не смог найти лучшего способа для анализа этого фрейма данных, я понимаю, что для циклов общеизвестно медленно, если вы можете предложить другой инструмент для анализа, дайте мне знать.
Спасибо!