[英]Reading data from a website into Pandas, but the data is not in a typical table or csv format
從網站讀取數據到Pandas,但是網站上的數據不是標准表格或csv格式。 這是數據鏈接:
http://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/hungarian.data
請注意,您在鏈接中看到的“行”不是輸入數據集的實際行。 而是,網頁上每10組“行”在輸入數據集中都是一行。 數據中的每個空格都應指示一個新列的定界符。 輸入數據集具有294行和76列。
因此,這是輸入數據集的前兩行,就像您在網頁上看到的那樣-請注意,輸入數據集的每一行都以單詞“ name”作為每行的最后一個值結尾:
1254 0 40 1 1 0 0
-9 2 140 0 289 -9 -9 -9
0 -9 -9 0 12 16 84 0
0 0 0 0 150 18 -9 7
172 86 200 110 140 86 0 0
0 -9 26 20 -9 -9 -9 -9
-9 -9 -9 -9 -9 -9 -9 12
20 84 0 -9 -9 -9 -9 -9
-9 -9 -9 -9 -9 1 1 1
1 1 -9. -9. name
1255 0 49 0 1 0 0
-9 3 160 1 180 -9 -9 -9
0 -9 -9 0 11 16 84 0
0 0 0 0 -9 10 9 7
156 100 220 106 160 90 0 0
1 2 14 13 -9 -9 -9 -9
-9 -9 -9 -9 -9 -9 -9 11
20 84 1 -9 -9 2 -9 -9
-9 -9 -9 -9 -9 1 1 1
1 1 -9. -9. name
當我使用pd.read_csv讀取數據時,Pandas認為網頁上的每一行都是數據集中的一行,因此我得到了一個長列,其中每一行都是字符串。 我沒有得到帶有76列的294行,而是得到了帶有1列字符串的2940行。
我想要的輸出數據幀將每10行的集合放到一行中,然后將所有值都用空格分隔,以作為分隔符。
不幸的是, pd.read_csv
在自定義行結尾時不是很靈活(它們只能是單個字符)。 我建議定義您自己的函數以從文件中讀取並一次產生一個“行”,其中'name'
之間'name'
所有行都為一行。 例如:
def my_data_file_reader(file_name):
with open(file_name) as f: # read from your datafile
row = [] # store incomplete rows here
for line in f: # iterate through each line
line = line.split()
row.extend(line) # add each line to row (flattened)
if line[-1] == 'name': # yield row and reset it if a line ends with 'name'
yield row
row = []
然后使用pd.DataFrame
而不是pd.read_csv
構建數據pd.read_csv
import pandas as pd
df = pd.DataFrame(my_data_file_reader('datafile.data'))
如果您的'datafile.data'
僅包含示例中給出的兩行,則可以預期df
類似於:
print(df)
0 1 2 3 4 5 6 7 8 9 ... 66 67 68 69 70 71 72 73 74 \
0 1254 0 40 1 1 0 0 -9 2 140 ... -9 -9 1 1 1 1 1 -9. -9.
1 1255 0 49 0 1 0 0 -9 3 160 ... -9 -9 1 1 1 1 1 -9. -9.
75
0 name
1 name
[2 rows x 76 columns]
link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/hungarian.data'
import urllib.request
import io, re
ln1 = " ".join([re.sub('\n', ' ',el)
for el
in [f'{ch}'
for ch
in urllib.request.urlopen(link)]])
df = pd.read_csv(io.StringIO('\n'.join(re.split('name', ln1))), delim_whitespace=True)
df.head()
1254 0 40 1 1.1 0.1 0.2 -9 2 140 ... -9.26 -9.27 -9.28 1.2 1.3 1.4 1.5 1.6 -9. -9..1
0 1255 0 49 0 1 0 0 -9 3 160 ... -9 -9 -9 1 1 1 1 1 -9.0 -9.0
1 1256 0 37 1 1 0 0 -9 2 130 ... -9 -9 -9 1 1 1 1 1 -9.0 -9.0
2 1257 0 48 0 1 1 1 -9 4 138 ... -9 2 -9 1 1 1 1 1 -9.0 -9.0
3 1258 0 54 1 1 0 1 -9 3 150 ... -9 1 -9 1 1 1 1 1 -9.0 -9.0
4 1259 0 39 1 1 0 1 -9 3 120 ... -9 -9 -9 1 1 1 1 1 -9.0 -9.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.