将Web数据文件加载到pandas数据帧

时间:2017-04-15 05:47:55

标签: 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

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

1 个答案:

答案 0 :(得分:6)

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抓取页面上的文本,而不是链接。

猴子修补刮刀以获取链接:

要获取网址,我们可以像以下一样修补图书馆:

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