Как правильно объединить 3 фрейма данных, извлеченные с помощью al oop в python? - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь объединить 3 таблицы, извлеченные из 3 веб-страниц, из inte rnet в Python. Веб-страницы называются xxxxx1, xxxxx2 и xxxxx3. Все 3 базы данных имеют форму (60,26). Таким образом, после объединения всех трех баз данных форма должна быть (180,26). Моя проблема в том, что после конкатенации он остается (60,26). Вероятно, отображается только таблица из последнего URL (xxxxx03)?:

for i in range(1,4):

    name_r1 = ('xxxxx'+ i)

    r1 = requests.get(name_r1)

    dfs1 = pd.read_html(r1.content)
    
    df=pd.concat(dfs1)
    

df.shape

Вот что я получаю:

введите описание изображения здесь

Заранее спасибо

1 Ответ

2 голосов
/ 01 августа 2020

Вы либо добавляете в список, а затем объединяете после всего. Поскольку pd.read_html возвращает список DataFrame, мы будем использовать itertools, чтобы связать их все вместе, поэтому мы объединяем DataFrames, а не списки DataFrames.

from itertools import chain

l = []
for i in range(1, 4):
    name_r1 = ('xxxxx'+ i)
    r1 = requests.get(name_r1)
    l.append(pd.read_html(r1.content))
    
df = pd.concat(chain.from_iterable(l))

Или сделайте это в кратком понимании списка:

df = pd.concat(chain.from_iterable([pd.read_html(requests.get('xxxxx'+ i)) 
                                    for i in range(1, 4)]))

Вышеупомянутое будет эквивалентно созданию DataFrames путем конкатенации вывода pd.read_html и последующего объединения всех этих DataFrames после l oop.

l = []
for i in range(1, 4):
    name_r1 = ('xxxxx'+ i)
    r1 = requests.get(name_r1)
    l.append(pd.concat(pd.read_html(r1.content)))
    
df = pd.concat(l)
...