以下是我的selenium web scraper的最后一部分,它循环遍历此website page的不同标签,选择"导出数据"按钮,下载数据,添加" yearid"列,然后将数据加载到MySQL表中。
df = pd.read_csv(desired_filepath)
df = df.replace('%','',regex=True)
df["yearid"] = datetime.today().year
df.to_csv(desired_filepath)
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
.format(user="walker",
pw="password",
db="data"))
df.to_sql(con=engine, name='fg_test_hitting_{}'.format(button_text), if_exists='replace')
time.sleep(10)
driver.quit()
刮刀工作得很好,但是当数据加载到MySQL表中时,某些列作为TEXT加载时应该作为数字加载,最好是DOUBLE数据类型。我注意到这只发生在字符串末尾有%符号的列名中(即BB%)。我已经消除了列标题下所有行中的%符号,但数据仍然作为TEXT加载到MYSQL中。有没有办法在数据加载到MySQL之前更改列名中包含%符号的所有列的数据类型?提前谢谢!
答案 0 :(得分:0)
演示:
将URL解析为DF:
In [263]: df = pd.read_html(url, header=1)[11]
显示有问题的列:
In [264]: df[df.columns[df.columns.str.contains('%')]]
Out[264]:
BB% K%
0 18.5 % 19.2 %
1 12.8 % 11.5 %
2 11.0 % 13.1 %
3 8.7 % 18.3 %
4 13.5 % 16.0 %
.. ... ...
26 7.0 % 20.2 %
27 13.5 % 12.5 %
28 9.4 % 16.1 %
29 8.6 % 21.5 %
30 NaN NaN
[31 rows x 2 columns]
将它们转换为数字列:
In [265]: df[df.columns[df.columns.str.contains('%')]] = \
(df.filter(regex='%')
.apply(lambda x: pd.to_numeric(x.str.replace(r'[\s%]',''),
errors='coerce')))
结果:
In [266]: df[df.columns[df.columns.str.contains('%')]]
Out[266]:
BB% K%
0 18.5 19.2
1 12.8 11.5
2 11.0 13.1
3 8.7 18.3
4 13.5 16.0
.. ... ...
26 7.0 20.2
27 13.5 12.5
28 9.4 16.1
29 8.6 21.5
30 NaN NaN
[31 rows x 2 columns]
In [267]: df[df.columns[df.columns.str.contains('%')]].dtypes
Out[267]:
BB% float64
K% float64
dtype: object