Как я могу l oop через вложенный список хранить значения во фрейме данных? - PullRequest
0 голосов
/ 03 августа 2020

Учитывая вложенный словарь neighborhood_data и что первый элемент, т.е. neighborhood_data[0], отображает

{'type': 'Feature',
 'geometry': {'type': 'MultiPolygon',
  'coordinates': [[[[28.073783, -26.343133],
     [28.071239, -26.351536],
     [28.068717, -26.350644],
     [28.06663, -26.351362],
     [28.065161, -26.352135],
     [28.064671, -26.35399]]]],
'properties': {'cartodb_id': 1,
  'subplace_c': 761001001,
  'province': 'Gauteng',
  'wardid': '74202012',
  'district_m': 'Sedibeng',
  'local_muni': 'Midvaal',
  'main_place': 'Alberton',
  'mp_class': 'Settlement',
  'sp_name': 'Brenkondown',
  'suburb_nam': 'Brenkondown',
  'metro': 'Johannesburg',
  'african': 330,
  'white': 24,
  'asian': 0,
  'coloured': 2,
  'other': 0,
  'totalpop': 356}}}

Затем я создал пустой фрейм данных neighborhoods

# define the dataframe columns
column_names = ['Province', 'District', 'Local_municipality','Main Place', 'Suburb','Metro','Latitude','Longitude'] 

# instantiate the dataframe
neighborhoods = pd.DataFrame(columns=column_names)

Однако, когда Я прошел через neighborhoods_data, чтобы сохранить соответствующие данные в кадре данных neighborhoods. Я получил следующую ошибку:

for data in neighborhood_data:
    province = data['properties']['province']
    district = data['properties']['district_m']
    local_muni_name = suburb_name = data['properties']['local_muni'] 
    suburb_name = data['properties']['suburb_nam']
    metro = data['properties']['metro']
    
    suburb_latlon = data['geometry']['coordinates']
    subur_lat = suburb_latlon[[[[1]]]]
    suburb_lon = suburb_latlon[[[[0]]]]
    
    neighborhoods = neighborhoods.append({'Province': province,
                                          'District': district,
                                          'Local_municipality': local_muni_name,
                                          'Main place': main_place,
                                          'Suburb': suburb_name,
                                          'Metro': metro,
                                          'Latitude': suburb_lat,
                                          'Longitude': suburb_lon}, ignore_index=True)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-a5dc74ed4207> in <module>
      7 
      8     suburb_latlon = data['geometry']['coordinates']
----> 9     subur_lat = suburb_latlon[[[[1]]]]
     10     suburb_lon = suburb_latlon[[[[0]]]]
     11 

TypeError: list indices must be integers or slices, not list

Итак, как я могу сохранить координаты широты и долготы в столбцах «Широта» и « Долгота 'для пустого фрейма данных?

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Думаю, у вас неправильный формат координат. В настоящее время для него открываются три квадратные скобки, но нет закрывающих для него:

'coordinates': [[[[28.073783, -26.343133]... [28.064671, -26.35399],

Если вы хотите сохранить текущий формат, вам необходимо убедиться, что в ваших данных есть три недостающие квадратные скобки в конце ']]]' или удалите два в начале и отформатируйте свои координаты следующим образом:

'coordinates' : [[28.073783, -26.343133], [28.071239, -26.351536]...]

Затем вы можете получить доступ, используя:

suburb_latlon = data['geometry']['coordinates']
subur_lat = suburb_latlon[[0][1]]
suburb_lon = suburb_latlon[[0][0]]

Для доступа к первому элементу списка [28.073783 , -26.343133], а затем присвойте lat второму элементу в этом списке и lon первому элементу в этом списке.

0 голосов
/ 03 августа 2020

Ваш словарь искажен, в нем отсутствуют закрывающие квадратные скобки в ключе coordinates, но давайте предположим, что это правильный словарь:

{'geometry': {'coordinates': [[[[28.073783, -26.343133],
     [28.071239, -26.351536],
     [28.068717, -26.350644],
     [28.06663, -26.351362],
     [28.065161, -26.352135],
     [28.064671, -26.35399]]]],
  'properties': {'african': 330,
   'asian': 0,
   'cartodb_id': 1,
   'coloured': 2,
   'district_m': 'Sedibeng',
   'local_muni': 'Midvaal',
   'main_place': 'Alberton',
   'metro': 'Johannesburg',
   'mp_class': 'Settlement',
   'other': 0,
   'province': 'Gauteng',
   'sp_name': 'Brenkondown',
   'subplace_c': 761001001,
   'suburb_nam': 'Brenkondown',
   'totalpop': 356,
   'wardid': '74202012',
   'white': 24},
  'type': 'MultiPolygon'},
 'type': 'Feature'}

Затем, чтобы получить доступ к

suburb_latlon = data['geometry']['coordinates']
subur_lat = suburb_latlon[[[[1]]]] # <--- Indexing error here
suburb_lon = suburb_latlon[[[[0]]]] # <--- Indexing error here

Мы хотим сделать следующее (распаковать через дополнительные уровни списка, пока не получим нашу координату):

suburb_latlon = data['geometry']['coordinates']
subur_lat = suburb_latlon[0][0][0][1] # <--- Not sure what your logic is here, and why you would pick the first one, but I'll assume that given this indexing procedure you can customize this.
suburb_lon = suburb_latlon[0][0][0][0] # <--- Same here
...