Перебирайте столбцы и избегайте IndexError - PullRequest
0 голосов
/ 05 ноября 2019

Приведенный пример набора данных (реальные данные имеют (931, 674)):

12_longitude_1  12_latitude_1   14_longitude_2  14_latitude_2   15_longitude_3  15_latitude_3
           16             11             12               13             14              15     
           16             11             12               13             14              15  
           16             11             12               13             14              15   

Я бегу:

pd_out = pd.DataFrame({'zone': [], 'number': []})

for col_num in range(0, len(border.columns), 2):
    curr_lon_name = border.columns[col_num]
    curr_lat_name = border.columns[col_num + 1] # PROBLEM IS HERE
    num = curr_lon_name.split("_")[-1]
    border = border[[curr_lon_name, curr_lat_name]].dropna()
    border[curr_lon_name] = border[curr_lon_name].replace(r'[()]', '', regex=True)
    border[curr_lat_name] = border[curr_lat_name].replace(r'[()]', '', regex=True)
    border[curr_lon_name] = pd.to_numeric(border[curr_lon_name], errors='coerce')
    border[curr_lat_name] = pd.to_numeric(border[curr_lat_name], errors='coerce')
    geometry2 = [Point(xy) for xy in zip(border[curr_lon_name],border[curr_lat_name])]
    border_point = gpd.GeoDataFrame(border,crs=crs,geometry=geometry2)
    turin_final = Polygon([[p.x, p.y] for p in border_point.geometry])
    within_turin = turin_point[turin_point.geometry.within(turin_final)]
    curr_len = len(within_turin)
    pd_out = pd_out.append({'zone': "long_lat_{}".format(num), 'number': curr_len}, ignore_index=True) 

Но в строке ----> 7 curr_lat_name = border.columns[col_num + 1] я получаю:

Ошибка IndexE: индекс 3 выходит за пределы оси 0 с размером 3

1 Ответ

0 голосов
/ 05 ноября 2019

Python начинает индексирование с 0. Итак, если ваша ось имеет размер 3, то вы можете получить к ней доступ только с индексами 0, 1 и 2.

len(border.columns) - это (я полагаю) 3. Ипоэтому col_num примет значения 0 и 2 в вашем цикле for.

Когда оно принимает значение 2, а затем вы делаете border.columns[col_num + 1] в своей проблемной строке, вы пытаетесь получить доступ к оси за ее пределами. , поскольку col_num+1 равно 3.

...