Невозможно добавить несколько фреймов данных с помощью функции цикла — возвращает только пустой фрейм данных | Панды, Python

#python #pandas #dataframe #loops #append

Вопрос:

Я получил свои данные с помощью web-scrape, используя следующий код:

 import requests
import re
import pandas as pd
from urllib.parse import unquote
from json import loads
from bs4 import BeautifulSoup

# Download URL
url = "https://riwayat-file-covid-19-dki-jakarta-jakartagis.hub.arcgis.com/"
req = requests.get(url)

# Get encoded JSON from HTML source
encoded_data = re.search("window.__SITE="(.*)"", req.text).groups()[0]

# Decode and load as dictionary
json_data = loads(unquote(encoded_data))

# Get the HTML source code for the links
html_src = json_data["site"]["data"]["values"]["layout"]["sections"][1]["rows"][0]["cards"][0]["component"]["settings"]["markdown"]

# Parse it using BeautifulSoup
soup = BeautifulSoup(html_src, 'html.parser')

# Get links
links = soup.find_all('a')

# For each link...
link_list = []
id_list = []
date_list = []
dataframe_csv = []

for link in links:
    if "2021" in link.text:
       link_list.append(link.text " - " link.attrs['href'])

link_list.remove("31 Januari 2021 Pukul 10.00 - https://drive.google.com/file/d/1vd1tToQbx3A420KMDA63aKviLjgGPJMd/view?usp=sharing")

for i in link_list:
    id_list.append(i.split("/")[5])
    date_list.append(i.split("/")[0][:-21])
    
for ID in id_list:
    dataframe_csv.append("https://docs.google.com/spreadsheets/d/" ID "/export?format=csv")
 

Я хочу добавить несколько фреймов данных в пустой фрейм данных «df_total» с помощью функции цикла. Внутри цикла я хочу удалить индекс строки 0 в каждом фрейме данных и добавить новый столбец под названием «Дата». Я использую следующий код:

 import time

start_time = time.time()

df_total = pd.DataFrame()

for i in range(0, len(dataframe_csv)):
    df = pd.read_csv(dataframe_csv[i])
    df = df.drop(index=df.index[0], axis=0)
    df = df.assign(Date = date_list[i])
        
    df_total.append(df,ignore_index=True)

elapsed_time = time.time() - start_time
print(elapsed_time)
 

Проблема в том, что приведенный выше код работает, но фрейм данных «df_total», похоже, не добавляется ни к одному фрейму данных, который я читал с пандами во время цикла. Я попытался увидеть размер фрейма данных со следующим кодом:

 df_total.shape
 

Приведенный выше код возвращает значение (0,0), означающее, что фрейм данных «df_total» по-прежнему пуст.

Ответ №1:

Наконец — то я нашел ответ на эту проблему. Поэтому я могу использовать следующий код:

 import time

start_time = time.time()

df_total = pd.DataFrame()

for i in range(0, len(dataframe_csv)):
    df = pd.read_csv(dataframe_csv[i])
    df = df.drop(index=df.index[0], axis=0)
    df = df.assign(Date = date_list[i])
    df_total = df_total.append(df, ignore_index = True)
    print(f"Merging a total of {i} Data Frames - Total Rows = {len(df_total)}")
    
elapsed_time = time.time() - start_time
print(elapsed_time/60)
 

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