【问题标题】:Reading semicolon separated data with read_html使用 read_html 读取分号分隔的数据
【发布时间】:2023-01-16 20:36:46
【问题描述】:

我想使用pandas.read_html()函数读取winequality-white.csv数据。

这是我的代码:

import pandas as pd

wine = pd.DataFrame(
    pd.read_html(
        "https://github.com/shrikant-temburwar/Wine-Quality-Dataset/blob/master/winequality-white.csv",
        thousands=";",
        header=0,
    )[0]
)

...但结果是:

Unnamed: 0 "fixed acidity";"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"
    0         NaN   7;0.27;0.36;20.7;0.045;45;170;1.001;3;0.45;8.8;6                                                                                                                       
    1         NaN  6.3;0.3;0.34;1.6;0.049;14;132;0.994;3.3;0.49;9...                                                                                                                       
    2         NaN  8.1;0.28;0.4;6.9;0.05;30;97;0.9951;3.26;0.44;1...                                                                                                                       
    3         NaN  7.2;0.23;0.32;8.5;0.058;47;186;0.9956;3.19;0.4...                                                                                                                       
    4         NaN  7.2;0.23;0.32;8.5;0.058;47;186;0.9956;3.19;0.4...                                                                                                                       

当然我可以选择raw,然后使用read_csv,但是如果是html阅读,我该如何解决呢?

【问题讨论】:

  • 但是为什么哦为什么要用pd.read_html()阅读它?!此外,pd.DataFrame(pd.read_html( 是多余的,因为 pd.read_html() 已经返回了 pd.DataFrame()

标签: python pandas


【解决方案1】:

好的,这是一个使用pd.read_html 的选项:

import pandas as pd

url = 'https://github.com/shrikant-temburwar/Wine-Quality-Dataset/blob/master/winequality-white.csv'

wine = pd.read_html(url, header=0)[0]

wine.drop('Unnamed: 0', axis=1, inplace=True)
headers = wine.columns[0].replace('"', '').split(';')
wine.columns = ['data']
wine[headers] = wine.data.str.split(';', expand=True)
wine.drop('data', axis=1, inplace=True)
wine.head()

上面的代码将导致:

>>> wine.head()
  fixed acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density    pH sulphates alcohol quality
0             7             0.27        0.36           20.7     0.045                  45                  170   1.001     3      0.45     8.8       6
1           6.3              0.3        0.34            1.6     0.049                  14                  132   0.994   3.3      0.49     9.5       6
2           8.1             0.28         0.4            6.9      0.05                  30                   97  0.9951  3.26      0.44    10.1       6
3           7.2             0.23        0.32            8.5     0.058                  47                  186  0.9956  3.19       0.4     9.9       6
4           7.2             0.23        0.32            8.5     0.058                  47                  186  0.9956  3.19       0.4     9.9       6
>>> 

但我永远不会用下面的 sn-p 的简单性来代替上面的代码:

import pandas as pd

url = 'https://raw.githubusercontent.com/shrikant-temburwar/Wine-Quality-Dataset/master/winequality-white.csv'

wine = pd.read_csv(url, header=0, sep=';')

【讨论】:

    【解决方案2】:

    你可能更好地使用github的rawdatacontent地址来解决由于不同的html接口导致的问题。

    这是你可以做的

    import pandas as pd
    import requests
    import io
    url = "https://raw.githubusercontent.com/shrikant-temburwar/Wine-Quality-Dataset/master/winequality-white.csv"
    r = requests.get(url)
    obj = io.BytesIO(r.content)
    wine = pd.read_csv(obj, delimiter=";")
    wine.head()
    

    【讨论】:

    • OP 知道 pd.read_csv() 并明确表示他们想要一个使用 pd.read_html() 的选项。此外,您通过添加 io.BytesIO()requests 使其过于复杂。 pd.read_html()pd.read_csv() 都可以自己处理URL
    • 我没有看到下面的评论,他们知道原始内容。并且先读取文件然后通过read_csv解析,我认为这比直接给出在线内容的路径更安全。感谢您的反馈意见
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2015-04-07
    • 2022-01-07
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多