#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)
Обратите внимание, что я забыл назначить добавленный фрейм данных в моем предыдущем коде. Теперь код успешно объединен в один огромный фрейм данных. Я также добавил функцию печати, чтобы я мог отслеживать, сколько кадров данных объединяется в определенный момент. Таким образом, я могу знать, где находится процесс слияния.