遍历列表,其中每个单元格都是嵌套字典

时间:2019-06-30 09:12:15

标签: python pandas for-loop

我有一个Pandas数据框,我在每个地址单元格上调用了Google Maps API,以便使用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

它输出一个在Google Maps API中通常被标记为政治性的城市列表。但是有一个错误,因为对于不具有这些标签的单元格,它不返回任何内容,因此我的location2列表比pandas列的长度短。

这是一个Google API结果的示例,该结果由于没有本地政治密钥而没有从循环中得到任何响应:

{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。

任何帮助将不胜感激。

此外,我找不到更好的方法来解析此数据帧,我意识到for循环众所周知地很慢,如果您可以建议使用其他工具进行解析的话,请告诉我。

谢谢!

0 个答案:

没有答案