在Dataframe中更改数据类型

iszxjhcz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(483)

下面是我的seleniumwebscraper的最后一部分,它循环遍历这个网站页面的不同选项卡,选择“exportdata”按钮,下载数据,添加一个“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()

scraper工作得很好,但是当数据被加载到mysql表中时,有一些列作为文本加载,而它们应该作为数字加载,最好是双精度数据类型。我注意到这只发生在字符串末尾有%符号的列名中(即bb%)。我已经消除了列标题下所有行中的%符号,但是数据仍然作为文本加载到mysql中。在将数据加载到mysql之前,是否有任何方法可以更改列名中带有%符号的所有列的数据类型?提前谢谢!

lnvxswe2

lnvxswe21#

演示:
将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

相关问题