python - 将 web 数据文件加载到 pandas dataframe

标签 python pandas

我想从网络加载一个 .csv 文件并将其转换为 pandas.DataFrame

这是我要在其中找到 .csv 文件的目标页面:

https://vincentarelbundock.github.io/Rdatasets/datasets.html

如何从网页中加载相应项目的.csv文件并转换为panda.DataFrame

此外,如果我也能从网页上获取.csv文件的地址,那就太好了。

这将允许我创建一个函数来转换目标页面的项目名称,它将返回 .csv 文件地址,如:

def data(item): 
    file = 'https://vincentarelbundock.github.io/Rdatasets/csv/datasets/'+str(item)+'.csv'

但是,网页中csv文件的地址并不都是一样的。

例如,

https://vincentarelbundock.github.io/Rdatasets/csv/Stat2Data/Cuckoo.csv 
https://vincentarelbundock.github.io/Rdatasets/csv/datasets/cars.csv

很多文件都在不同的目录下,所以我需要搜索'items'并获取对应的csv文件的地址。

最佳答案

Pandas 可以直接从 http 链接读取 csv:

示例;

df = pd.read_csv(
    'https://vincentarelbundock.github.io/Rdatasets/'
    'csv/datasets/OrchardSprays.csv')
print(df)

结果:

    Unnamed: 0  decrease  rowpos  colpos treatment
0            1        57       1       1         D
1            2        95       2       1         E
..         ...       ...     ...     ...       ...
62          63         3       7       8         A
63          64        19       8       8         C

[64 rows x 5 columns]

通过抓取获取链接:

要从首页获取链接本身,我们还可以使用 pandas 进行网络数据抓取。像这样的东西:

base_url = 'https://vincentarelbundock.github.io/Rdatasets/'
url = base_url + 'datasets.html'

import pandas as pd
df = pd.read_html(url, attrs={'class': 'dataframe'},
                  header=0, flavor='html5lib')[0]

会返回页面上表格中的数据。不幸的是,对于我们在这里的使用,这不起作用,因为 pandas 抓取页面上的文本,而不是链接。

Monkey Patching the scraper to get Links:

要获取 URL,我们可以像这样对库进行猴子修补:

def _text_getter(self, obj):
    text = obj.text
    if text.strip() in ('CSV', 'DOC'):
        try:
            text = base_url + obj.find('a')['href']
        except (TypeError, KeyError):
            pass
    return text

from pandas.io.html import _BeautifulSoupHtml5LibFrameParser as bsp
bsp._text_getter = _text_getter

测试代码:

base_url = 'https://vincentarelbundock.github.io/Rdatasets/'
url = base_url + 'datasets.html'

import pandas as pd
df = pd.read_html(url, attrs={'class': 'dataframe'},
                  header=0, flavor='html5lib')[0]

for row in df.head().iterrows():
    print('%-14s: %s' % (row[1].Item, row[1].csv))

结果:

AirPassengers: https://vincentarelbundock.github.io/Rdatasets/csv/datasets/AirPassengers.csv
BJsales      : https://vincentarelbundock.github.io/Rdatasets/csv/datasets/BJsales.csv
BOD          : https://vincentarelbundock.github.io/Rdatasets/csv/datasets/BOD.csv
CO2          : https://vincentarelbundock.github.io/Rdatasets/csv/datasets/CO2.csv
Formaldehyde : https://vincentarelbundock.github.io/Rdatasets/csv/datasets/Formaldehyde.csv

关于python - 将 web 数据文件加载到 pandas dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43422692/

相关文章:

python - 截至 2014 年 6 月,应该考虑使用哪些工具来提高 Python 代码性能?

Python在JSON结构中获取 sibling

python - 使用 ReportLab 将数据框转换为 PDF 中的 GRID。我怎样才能在网格的一列中划线

java - Pycharm - 内部启动问题 -java.lang.RuntimeException : Could not find installation home path

python - 根据 Pandas 中用户指定的日期列和输入参数计算特定函数

python - 将 pandas DataFrame 中的列转换为具有 nan 值的 float

python - Pandas 系列名称

python - AttributeError: 'list' 对象没有属性 'split'

python - 根据列值合并多个数据帧时缺少列

python - 如何用字典值替换 Pandas Series