将对象列表到 DataFrame 到 Azure 上的 MySQL DB

Posted

技术标签:

【中文标题】将对象列表到 DataFrame 到 Azure 上的 MySQL DB【英文标题】:List object to DataFrame to MySQL DB on Azure 【发布时间】:2021-11-04 14:45:22 【问题描述】:

我使用 Selenium 和 Pandas 从网站上抓取一个表格,生成一个列表对象。然后我尝试将列表转换为 DataFrame 以将其写入 mysql

当我打印我的抓取结果时,它是一个很好的表格格式,带有清晰的行号和列标题,但是当我执行“len”时,结果是 1。

我已经尝试了很多方法,并且确实需要一些帮助。

    from selenium import webdriver
from selenium.webdriver.chrome.options import Options
#import csv
from bs4 import BeautifulSoup
import pandas as pd
from pandas import DataFrame
import time
from sqlalchemy import create_engine

# base url
baseurl = "https://bitcoincharts.com/charts/bitstampUSD#igDailyztgSzm1g10zm2g25zv"



# selenium arguments
options = Options()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
options.headless = True
options.add_argument("--window-size=1920,1200")
driver = webdriver.Chrome(options=options, executable_path="C:/Users/mande/OneDrive/Knowledge/Python/chromedriver.exe")

# navigates to website
driver.get(baseurl)

# clicks "show raw data"
rawdata = driver.find_element_by_xpath("/html/body/div[5]/div/div[2]/a").click()
print("Sleeping 10 seconds")
time.sleep(10)
print("Continue")


soup = BeautifulSoup(driver.page_source, 'lxml')
tables = soup.find(id='chart_table')
df = pd.read_html(str(tables), header=0)
print(df[0])

driver.quit()

print(type(df))
print(len(df))

df2 = pd.DataFrame([df])
df2.columns = ['Rownumber', 'Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume (BTC)', 'Volume (USD)', 'Weighted Price']

engine = create_engine("mysql+pymysql://user:password@hostname/dbname"
                       .format(user="user",
                               pw="password",
                               db="dbname"))

DataFrame.to_sql(df2, name='bitcoin',  con = engine, if_exists='append', chunksize=10000, index=False)


console:
ValueError: Length mismatch: Expected axis has 1 element, new values have 9 elements

【问题讨论】:

【参考方案1】:

替换这两行:

df2 = pd.DataFrame([df])
df2.columns = ['Rownumber', 'Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume (BTC)', 'Volume (USD)', 'Weighted Price']

df2 = df[0]

帮我修好了。

【讨论】:

这对我有用,谢谢。这让我想到了一个新问题,我希望能得到一些关于如何解决的想法。我的数据集包含“-”作为 null 的替代品,这会在尝试插入时导致错误。我应该尝试在 Python 中将“-”转换为 null,还是在 MySQL 中使用可以更改插入值的 IF 语句创建存储过程? 我会在 Python 中使用 Series.replace,但也许这只是因为我更喜欢 Python 而不是 MySQL。 ;) 感谢您的帮助,您的帮助很大。很遗憾,我没有足够的积分将您的回复选为“答案”。 @ananame111 您需要15 reputation to vote up an answer,但您可以在没有任何声誉的情况下接受答案。 (绿色复选标记。)

以上是关于将对象列表到 DataFrame 到 Azure 上的 MySQL DB的主要内容,如果未能解决你的问题,请参考以下文章

将列表列表获取到 pandas DataFrame

Pandas DataFrame 到列表列表

Python - 用于将值从列表分配到 DataFrame 列表的列表理解表达式

将 Python DataFrame 作为 CSV 写入 Azure Blob

将列表中的 n 个 DF 合并到单个 DataFrame - Scala

将列表或系列作为一行附加到 pandas DataFrame?