Как преобразовать строки в цикл для Pandas DataFrame в Python? - PullRequest
0 голосов
/ 17 октября 2019

Я собираю некоторые данные с веб-сайта для создания карты. У меня есть несколько строк (широта и долгота) внутри цикла for следующим образом. Как только я выясню это, я добавлю другую информацию в фрейм данных.

28.5455
66.91390228
59.01139831542969 44.451599
38.55390167
35.2804985046
34.2961998

Я пытаюсь преобразовать это в Pandas DataFrame, но когда я это делаю, все индексы равны 0 вместо 0,1,2 ...

for row in csvread:
icao = row[0]
name = row[1]
latitude = row[2]
longitude = row[3]
metar_link = 'https://www.aviationweather.gov/metar/data?ids=' + icao + '&format=decoded&date=&hours=0'
page = requests.get(metar_link)
soup = bs(page.content, 'html.parser')

if soup.select_one('td:contains("Text:") + td').text == 'No data found' or not 'SM' in (
        soup.select_one('td:contains("Text:") + td').text):
    #print(icao, 'no metars available for this airport!')
    continue

metar = soup.select_one('td:contains("Text:") + td').text
metar_data = func.fraction(metar)
visibility = float(func.convert_to_float(metar_data))
ceiling = func.convert_ceiling(metar)
flight_conditions = func.flight_conditions(ceiling, visibility)
color = func.colorize(flight_conditions)

data = pd.DataFrame({
    'lat': [latitude],
    'lon': [longitude]
})

print(data)

Когда япечать данных, я получаю:

       lat         lon
0  28.5455  -81.332901
           lat          lon
0  66.91390228  -151.529007
           lat           lon
0  65.99279785  -153.7039948
           lat           lon
0  59.75439835  -154.9109955
                 lat                  lon
0  59.01139831542969  -161.82000732421875
         lat         lon
0  44.451599  -83.394096
           lat           lon
0  38.55390167  -121.2979965
             lat             lon
0  35.2804985046  -116.629997253
          lat           lon
0  34.2961998  -116.1620026
       lat         lon
0  39.1754  -76.668297

Проблема в том, что все индексы равны 0, они должны увеличиваться на 1. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Не создавайте фрейм данных внутри цикла. Вместо этого соберите все необходимые значения в списке или словаре, а затем свяжите их с фреймом данных вне цикла. Прямо сейчас вы, кажется, печатаете фреймы данных из одной строки внутри цикла, поэтому будет отображаться только 0-индекс.

В частности, создайте словарь всех необходимых значений внутри цикла, а затем свяжите его в конструкторе DataFrameоднажды вне петли. Ниже предполагается, что все значения, которые вы извлекаете из BeautifulSoup и обрабатываете с помощью func, являются скалярами (не повторяемыми для нескольких значений):

data_list = []

for row in csvread:
   icao, name, latitude, longitude = row[0:3]

   metar_link = ('https://www.aviationweather.gov/metar/data?ids=' + icao + 
                 '&format=decoded&date=&hours=0')

   page = requests.get(metar_link)
   soup = bs(page.content, 'html.parser')

   if soup.select_one('td:contains("Text:") + td').text == 'No data found' \
       or not 'SM' in (soup.select_one('td:contains("Text:") + td').text):
       #print(icao, 'no metars available for this airport!')
       continue

   # ASSUMED ALL VALUES BELOW ARE SCALARS
   metar = soup.select_one('td:contains("Text:") + td').text
   metar_data = func.fraction(metar)
   visibility = float(func.convert_to_float(metar_data))
   ceiling = func.convert_ceiling(metar)
   flight_conditions = func.flight_conditions(ceiling, visibility)
   color = func.colorize(flight_conditions)

   # APPEND DICTIONARY TO LIST (INSIDE LOOP)
   data_list.append({'icao': icao, 'name': name, 'latitude': latitude, 
                     'longitude': longitude, 'metar': metar, 
                     'metar_data': metar_data, 'visibility': visibility,
                     'flight_conditions': flight_conditions, 'color': color})

# BIND LIST OF DICTS (OUTSIDE LOOP)
final_df = pd.DataFrame(data_list)
0 голосов
/ 17 октября 2019

Вы можете использовать

data=data.reindex(list(range(0,len(df),1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...