将网络数据文件加载到pandas数据帧中。

5
我想从网页中加载一个 .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文件的地址。


今天似乎对我来说是个糟糕的日子。再次浪费时间阅读一个在我看来不是问题(如果考虑问题规则)的问题... 这个问题描述了问题,但缺少一部分:你自己描述的问题你做了什么来解决它? - Claudio
1
@Claudio,你能告诉我在哪里规定必须展示你尝试过的内容吗? - Stephen Rauch
你想从这个页面读取所有数据集吗? - Hackaholic
@Claudio,第一个链接是关于作业的,第二个链接甚至没有包含show这个词,它肯定没有说你必须做任何事情。但我找到了这个页面,我会尝试遵循它,所以感谢您的反馈。 - Stephen Rauch
从http://stackoverflow.com/tour: "包括关于您尝试过什么的详细信息。" - 是的,我可以理解您的感受... - Claudio
1个回答

10

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)爬虫以获取链接:

要获取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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接