【问题标题】:Changing Data Types in Pandas Data Frame更改 Pandas Dataframe 中的数据类型
【发布时间】:2018-06-17 19:12:31
【问题描述】:

下面是我的 selenium 网络爬虫的最后一部分,它循环遍历此 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 之前,是否有任何方法可以更改列名中具有 % 符号的所有列的数据类型?提前致谢!

【问题讨论】:

  • 请缩小您的问题范围。回答您的(标题)问题真的需要整个 selenium 代码吗?
  • 这个版本更好吗?

标签: python mysql pandas selenium sqlalchemy


【解决方案1】:

演示:

将 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

【讨论】:

  • 效果很好!谢谢MaxU!非常感谢详细的回复!
  • 快速问题...有一个标题为“HR/FB”的令人讨厌的列,在每个值后使用 % 符号。 df.columns.str.contains 可以搜索“%”符号和“HR/FB”列吗?我试过使用 |操作数,但我不断收到错误消息。再次感谢您的帮助!
  • @NateWalker,试试这个:df[df.columns[df.columns.str.contains(r'(?:%|HR\/FB)')]]
  • 不知道为什么会发生这种情况,但是刮板运行了大约一半,然后触发错误“列必须与键长度相同。”当我只搜索 % 符号时,我从来没有遇到过这个错误。有什么想法吗?感谢所有帮助!
  • @NateWalker,哪一行代码产生了这个错误?
猜你喜欢
  • 1970-01-01
  • 2019-02-15
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2020-05-12
  • 2019-04-17
相关资源
最近更新 更多