Не создавайте фрейм данных внутри цикла. Вместо этого соберите все необходимые значения в списке или словаре, а затем свяжите их с фреймом данных вне цикла. Прямо сейчас вы, кажется, печатаете фреймы данных из одной строки внутри цикла, поэтому будет отображаться только 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)