天天看點

《Python資料科學指南》——1.20 從表格資料使用數組

本節書摘來自異步社群《python資料科學指南》一書中的第1章,第1.20節,作者[印度] gopi subramanian ,方延風 劉丹 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

資料科學的應用程式要成功解決一個問題,必須先找到适當的處理資料的方法。例如在機器學習中對資料進行預測或分類,要麼采用有監督的方法,要麼采用無監督的方法。而在此之前,傳輸資料,把資料清洗到比對算法,可能已經花費了很長的時間。

通常,有很多種方法對資料進行整理使之适合資料科學程式進行處理,資料科學程式開發者首先面對的挑戰是如何通路資料,并用python的資料結構讓這些資料持續可用。掌握使用python通路資料的訣竅是非常有用的,能讓你避過紛擾,直接面對問題的核心内容。

一般資料是以文本的形式存放的,用逗号或者tab作為分隔符。我們可以采用python的内置檔案對象工具來進行處理。如前所述,檔案對象實作了_iter_()和next()方法,這讓我們可以處理非常大的檔案,這些檔案無法一次全部裝載到記憶體裡,隻能每次讀取其中的一小部分。

python的機器學習庫(如scikit-learn)就是基于numpy庫,在這節中,我們将研究如何高效地讀取外部資料,并将之轉為numpy的數組以便後續的資料處理。

numpy提供了一個genfromtxt函數可以從表格資料中建立數組,資料存放到numpy數組中以後,系統處理資料就輕松得多。我們通過一個numpy 1.8.0編寫的代碼來看看如何使用genfrom text。

我們先從導入必需的庫開始,先定義輸入的例子,然後示範如何處理表格資料。

第1步中,我們用stringio來模拟表格資料,有3個行和3個列,行通過換行表示,列則通過逗号分隔。

第2步中,我們用numpy的genfromtxt導入資料到numpy數組。genfromtxt的第一個參數是檔案源和檔案名,本例中是stringio對象。輸入由逗号分隔,分隔符參數允許我們自己定義分隔符。運作上面的代碼後,資料格式如下。

如你所見,我們成功地将字元串資料加載到了numpy數組中。

下面列出了genfromtxt函數的各個參數以及預設值。

唯一必備的參數是資料源的名字,本例中是一個stringio對象,它可以是一個檔案名或者帶有read方法的類似于檔案的對象,也可以是一個遠端檔案的url。

首先必須将給定的行分成列,當檔案被打開進行讀取時,genfromtxt将非空行切分成一個字元串序列。空行和注釋行會被忽略,注釋選項幫助gentext判斷哪些行是注釋行。我們指定的分隔符将字元串切分為列。我們的示例使用“,”作為分隔符。制表符“/t”也是一種常用的分隔符。gentext的預設分隔符是none,這意味着行被空格分成多個列。

一般而言,行被轉換成字元串序列之後,列被萃取出來,每個獨立的列并沒有被清除前導或者後導的空格。在上面示例代碼的後面部分,這種情況需要進行處理,特别是有些變量要被作為字典的鍵。例如,若是前導或後導的空格沒有被處理完全,代碼可能會出現bug或錯誤。設定參數autostrip=true有助于避免這類問題。

很多情況下,我們在讀取檔案的時候要跳過一些資料,比如跳過最前n行或者最後n行,這就需要使用headers和footers參數。設定skip_header=n會在讀檔案時跳過最開始的n行。類似地,設定skip_footer=n則跳過最後的n行。

和不需要的行類似,有時我們需要跳過一些列,usecols參數可以指定一個包含所需要的列的清單。

在上面的示例中,我們隻選擇了兩個列,第0和第1列。資料對象形式如下。

使用names參數,我們可以自定義列名,由逗号分隔的列名字元串參數形式如下。

設定names參數為真,輸入檔案的第1行會被當成列名。

這個函數比genfromtxt要簡單一些,如果你不需要複雜的資料處理架構,比如處理丢失的資料等情況,你可以選用loadtxt。

此外,如果你不需要裝載資料到numpy數組,隻想把資料加載到清單中,python預設提供了csv庫,可以參考下面的url。

<code>https://docs.python.org/2/library/csv.html.</code>

上面這個csv庫裡有一個有趣的方法叫作csv.sniffer.sniff()。要處理一個很大的csv檔案時,我們要了解它的結構,就可以使用sniff()函數,它傳回一個具有csv檔案大部分屬性的子類。