在Pandas数据框中更改数据类型

时间:2018-06-17 19:12:32

标签: python mysql pandas selenium sqlalchemy

以下是我的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之前更改列名中包含%符号的所有列的数据类型?提前谢谢!

1 个答案:

答案 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