Ошибка в For L oop Logi c для столбца в Pandas Python 3 - PullRequest
0 голосов
/ 08 января 2020

У меня есть список мест. Для каждого местоположения в столбце местоположения существует функция, которая находит его координаты, если их там еще нет. Эта операция выполняется для всех. L oop копирует последнее значение широт и долгот во всех строках, чего не должно быть. Где я делаю ошибку?

Что у меня есть

location           gpslat gpslong
Brandenburger Tor  na     na
India Gate         na     na
Gateway of India   na     na

Что я хочу

location           gpslat gpslong
Brandenburger Tor  52.16  13.37
India Gate         28.61  77.22
Gateway of India   18.92  72.81

Что я получаю

location           gpslat gpslong
Brandenburger Tor  18.92  72.81
India Gate         18.92  72.81
Gateway of India   18.92  72.81

Мой Код

i = 0
for location in df.location_clean:
    try:
        if np.isnan(float(df.gpslat.iloc[i])) == True:
                df.gpslat.iloc[i], df.gpslong.iloc[i] = find_coordinates(location)
                print(i, "Coordinates Found for --->", df.location_clean.iloc[i])
        else:
            print(i,'Coordinates Already Present')
    except:
        print('Spelling Mistake Encountered at', df.location_clean.iloc[i], 'Moving to NEXT row')
        continue
    i = i + 1

Полагаю, я делаю логическую ошибку либо с индексом i, либо с оператором df.gpslat.iloc[i], df.gpslong.iloc[i] = find_coordinates(location). Я попытался изменить их и перезапустить l oop, но это то же самое. Это также трудоемкий процесс, так как есть тысячи мест.

1 Ответ

1 голос
/ 08 января 2020

Трудно помочь, не видя данных, но это может помочь вам.

  • В будущем, пожалуйста, предоставьте минимальный пример ваших данных, чтобы мы могли работать с ними и помочь вам лучше.
  • Кроме того, вы никогда не должны использовать «кроме» без указания точной ошибки - в этом случае ваше исключение отлавливает ВСЕ ошибки, даже если есть что-то еще, кроме вашей «орфографической ошибки» - без вашего ведома!
  • При итерации по фрейму данных используйте iterrows () - это делает его намного более читабельным, и вам не нужно использовать дополнительные переменные
  • при использовании ilo c открывает вас до pandas 'SettingWithCopyWarning (см. Здесь: https://www.dataquest.io/blog/settingwithcopywarning/), попробуйте избежать этого.

Вот код:

# ____ Preparation ____ 
import pandas as pd
import numpy as np

lst = [['name1', 1, 3]
      ,['name2',1, 3]
      ,['name3',None, None]
      ,['name4',1, 3]
       ]
df = pd.DataFrame(lst,    columns =['location', 'gpslat', 'gpslong',])
print(df.head())

# ____ YOUR CODE ____ 
for index, row in df.iterrows():
       try:
              if np.isnan(float(row['gpslat'])) == True:
                     lat, long = find_coordinates(row['location'])
                     print(lat,long)
                     df.at[index, 'gpslat'] = lat
                     df.at[index, 'gpslong'] = long

       except TypeError:  # exchange this with the exact error which you want to  catch
              print('Spelling Mistake Encountered at', row['location'], ' in row ', index, 'Moving to NEXT row')
              continue
print(df.head())
...