【问题标题】:pandas.read_html converting only specific columns to floatpandas.read_html 仅将特定列转换为浮动
【发布时间】:2020-03-19 07:54:33
【问题描述】:

我正在尝试创建一个程序来读取站点中的表格并仅将表格列的一部分转换为浮动。

此站点表如下所示:

Account   Responsible     Grade
1.0.0     João Da Silva   3,5
1.1.0     Antônio Pereira 2,5
1.2.0     Maria do Céu    4,5
1.2.1     Joana Antunes   5,0

为此,我使用了 BeautifulSoup 和 pandas.read_html,如下所示

import BeautifulSoup as bs
import pandas as pd
############################################################
# This part of the code was voided to simplify my question #
############################################################
soup = bs(page_source,'html.parser')
table = soup.find('table',{'id': 'table_id'})
data = pd.read_html(str(table), encoding = 'utf-8', decimal=",", thousands='.')[0]

当我这样做时,除了“帐户”列之外,表格将按照我的意愿进行转换,返回的 pandas 数据框如下所示:

Index   1       2               3
0       Account Responsible     Grade
1       100     João Da Silva   3.5
2       110     Antônio Pereira 2.5
3       120     Maria do Céu    4.5
4       121     Joana Antunes   5.0

我的想法是保持“帐户”列值与原始表中的值保持一致,以避免任何错误转换并将其他表值转换为应有的值(对于此示例,它应该是 [str,str,float]) .

Index   1         2               3
0       Account   Responsible     Grade
1       1.0.0     João Da Silva   3.5
2       1.1.0     Antônio Pereira 2.5
3       1.2.0     Maria do Céu    4.5
4       1.2.1     Joana Antunes   5.0

有没有可能的方法来执行这种转换?

感谢您从现在开始提供的所有支持和最诚挚的问候。

【问题讨论】:

    标签: python pandas type-conversion


    【解决方案1】:

    您可以尝试为该列设置转换器。

    data = pd.read_html(str(table), encoding = 'utf-8', decimal=",", thousands='.', converters={'Account': str})[0]
    

    【讨论】:

    • 我尝试按照您的建议设置转换器,但没有成功。 Account 列仍被转换为整数。
    • 数据框的 dtype 是什么。 print(data.dtypes) 显示什么?
    • 它正在返回:“object”到 Account 列,“object”到 Responsible 列,“float 64”到 Grade。
    【解决方案2】:

    This 帮助:

    data = pd.read_html(str(table), encoding = 'utf-8', thousands="ª", decimal="ª")[0]
    data['Grade'] = data['Grade'].apply(lambda x: float(x.replace(',', '.')))
    

    this:

    data = pd.read_html(str(table), encoding = 'utf-8', thousands=None)[0]
    data['Grade'] = data['Grade'].apply(lambda x: float(x.replace(',', '.')))
    

    【讨论】:

    • 我的解决方案类似于您所做的。但我一直在寻找更多“流行病解决方案”,使用 pandas 数据框配置。
    猜你喜欢
    • 2014-08-27
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多