簡體   English   中英

將數據從網站讀取到Pandas中,但是數據不是典型的表格或csv格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM