首页 > 解决方案 > 从数据集中提取数据在线

问题描述

数据集链接

我有一个数据集,在 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')

请进一步帮助。

标签: pythonpython-3.xpandasweb-scrapingbeautifulsoup

解决方案


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

import pandas as pd
import numpy as np
import re
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')

p = re.compile(r'(?<=\d\.\s)[a-z]+')
columns = p.findall(table_header.text)
data = list(i.split(',') for i in table_data.text.split('\n'))
df = pd.DataFrame(data, columns=columns).apply(pd.to_numeric, errors='ignore')

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


推荐阅读