从数据集中在线提取数据

时间:2018-07-29 13:38:22

标签: python python-3.x pandas web-scraping beautifulsoup

DataSet Link

在上面的链接中,我有一个数据集可以在Bupa.data中以CSV格式提供,而属性数据在Bupa.name文件的第7点中给出。

https://archive.ics.uci.edu/ml/machine-learning-databases/liver-disorders/

我很困惑如何合并两个链接以从两个链接创建数据帧,因为一个包含标头信息,另一个包含csv格式的数据。

我对python很满意,并从以下代码开始:

import pandas as pd
from bs4 import BeautifulSoup
from urllib.request import Request,urlopen
soup_link1 = BeautifulSoup(urlopen('https://archive.ics.uci.edu/ml/machine-learning-databases/liver-disorders/bupa.data'))
soup_link2 = BeautifulSoup(urlopen('https://archive.ics.uci.edu/ml/machine-learning-databases/liver-disorders/bupa.names'))
table_data = soup_link1.find('p')
table_header = soup2_link.find('p')

请进一步帮助。

2 个答案:

答案 0 :(得分:0)

要创建对不同属性名称具有鲁棒性的代码,可以使用正则表达式从文件中获取数据。在您的特定情况下:

hello

此类数据的巨大问题在于所有内容都是字符串,因此我们必须在字符串和浮点数之间进行大量转换。

答案 1 :(得分:0)

您可以合并来自两个URL的数据并创建虚拟csv文件(然后可以将创建的csv文件提供给数据框或进行其他处理):

import requests
import re
import csv
from io import StringIO # for Python2 use: from StringIO import StringIO

data_1 = requests.get('https://archive.ics.uci.edu/ml/machine-learning-databases/liver-disorders/bupa.data').text
data_2 = requests.get('https://archive.ics.uci.edu/ml/machine-learning-databases/liver-disorders/bupa.names').text

row_names = re.findall(r'\d+\.\s+([a-z]+)', data_2)
f = StringIO(','.join('"{}"'.format(v) for v in row_names) + '\n' + data_1)

cr = csv.reader(f, delimiter=',')  # cr is your created csv file

for row in cr:
    print(row)

输出:

['mcv', 'alkphos', 'sgpt', 'sgot', 'gammagt', 'drinks', 'selector']
['85', '92', '45', '27', '31', '0.0', '1']
['85', '64', '59', '32', '23', '0.0', '2']
['86', '54', '33', '16', '54', '0.0', '2']
['91', '78', '34', '24', '36', '0.0', '2']
['87', '70', '12', '28', '10', '0.0', '2']
['98', '55', '13', '17', '17', '0.0', '2']
['88', '62', '20', '17', '9', '0.5', '1']
['88', '67', '21', '11', '11', '0.5', '1']
['92', '54', '22', '20', '7', '0.5', '1']

...and so on.