Выполните итерацию по циклу и добавьте список к кадру данных в новой строке или новом столбце - PullRequest
0 голосов
/ 15 января 2019

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

Теперь с помощью кода я могу создать фрейм данных, который добавляет все списки вместе в один столбец или одну строку в фрейме данных. Но я хочу каждую итерацию внутреннего цикла отдельно в новом столбце или строке кадра данных.

list_rows = [] 
for x in link_href_list: 
    urllib.request.urlopen(x)
    html = urlopen(x)
    bs = BeautifulSoup(html, "lxml")    
    table=bs.find('tbody')
    rows = table.tr.next_siblings

    for row in rows:
        a=row.find('td').get_text().strip()
        list_rows.append(a)
list_rows.to_frame()

К сожалению, списки внутреннего цикла будут иметь разную длину! может у кого-то есть простое решение или подсказка, что я могу изменить? Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Один из способов сделать это - создать пустой список снаружи, а затем добавить его в цикл, который вы пробовали. Ваша проблема, кажется, создает Dataframe. Я бы только прокомментировал ответ выше для ссылки других, однако я не могу оставлять комментарии в этом представлении.

Определите столбцы, а затем создайте кадр данных, используя from_records

 import pandas as pd
 cols = ['col_1','col_2',...,'col_n']
 df = pd.DataFrame.from_records(list_cols, columns=cols)

Ответ выше создает список (list_columns = []), который затем пытается преобразовать в Dataframe. Это должно бросить следующее:

 Traceback (most recent call last):
   File "<ipython-input-396-dc539f26ae12>", line 1, in <module>
    list_columns.Dataframe()

 AttributeError: 'list' object has no attribute 'Dataframe'
0 голосов
/ 15 января 2019

Полагаю, вы имели в виду каждую итерацию внешнего цикла в новой «строке». В результате будет создан 2-мерный массив (список), для каждого элемента в link_href_list вы получите новую «строку». Хотя я понятия не имею, что такое метод to_frame (), я предполагаю, что это распечатка.

list_columns = [] 
for x in link_href_list: 
    urllib.request.urlopen(x)
    html = urlopen(x)
    bs = BeautifulSoup(html, "lxml")    
    table=bs.find('tbody')
    rows = table.tr.next_siblings
    list_rows = []

    for row in rows:
        a=row.find('td').get_text().strip()
        list_rows.append(a)
    list_columns.append(list_rows)
list_columns.DataFrame()

Редактировать: Если to_frame - это объект DataFrame от pandas, я не совсем уверен, как он будет обрабатывать различные длины. Я проверю пару, но есть и способ обойти это. Кажется, что очень простого ответа на вопрос о том, как импортировать списки разной длины, нет под рукой, найти самый длинный список и соответствующим образом настроить импорт панд, а также создать списки равной длины в новом цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...