給妹子講python-S02E09Pandas引言與Series簡介

python,不管你懂沒懂,反正妹子是搞懂了

轉載請註明:知乎專欄《給妹子講python》--醬油哥

【要點搶先看】

1.Pandas學習的必要性以及學習思路2.Series是增強版的一維數組,強在其任意類型的索引序列3.Series可以使用字典進行生成

從這一集開始,我們從繪圖的內容中回來,介紹Python數據處理的另一個庫Pandas。Pandas是在Numpy的基礎上建立的第三方程序庫。

之所以在掌握了NumPy之後還要學習和使用Pandas,是因為ndarray數據結構常常作用於那些常見的乾淨整齊、組織良好的數據,但是我們在實際工作中面對的往往是更靈活、更複雜的任務和略顯髒亂的數據,比如數據標籤,清理缺失值,以及數據分組和數據透視。光使用NumPy去應對這些工作,就顯得有些力不從心了。

但是這些數據清洗的工作,卻是我們日常在數據分析過程中不可或缺的環節,而Pandas的Series和DataFrame對象就為我們的這種應用需求提供了捷徑。

構成Pandas的三大數據結構基石是:Series、DataFrame、Index。Pandas對於數據的任何處理工作,都是由他們來實現,這幾集我們學習Pandas的思路是,先快速瀏覽這個三個數據結構,然後再按功能的具體分類,結合這三類數據結構來進行Pandas的學習

那麼,我們今天就先來介紹Pandas中的第一個核心對象,Series對象。

Pandas是第三方庫,需要單獨安裝,需要提醒一點的是,由於Pandas是基於NumPy工具庫的,所以需要先安裝好NumPy,這裡我們還是在命令行下使用pip3工具進行安裝。

pip3 install Pandas即安裝完畢,非常簡單

Series對象是一個帶索引數據的一維數組,可以視作是增強版的NumPy結構。

最簡單的,可以用一個數組創建Series對象

import pandas as pddata = pd.Series([0.25,0.5,0.75,1])print(data)0 0.251 0.502 0.753 1.00dtype: float64

這就是一個最簡單的Series對象,它將一組數據和一組索引(這裡沒有顯式指定,因此是默認的從0開始的整數)綁定在一起。

我們具體來看看他的索引和數據:

import pandas as pddata = pd.Series([0.25,0.5,0.75,1])print(data.values)print(type(data.values))print(data.index)print(type(data.index))[ 0.25 0.5 0.75 1. ]<class numpy.ndarray>RangeIndex(start=0, stop=4, step=1)<class pandas.indexes.range.RangeIndex>

我們從代碼的結果可以看到,我們通過values屬性獲取Series的數據部分,類型是numpy里的ndarray數組,通過index屬性返回索引對象,索引對象是一個類數組,就是我們後面要介紹的另一個Index數據類型。

import pandas as pddata = pd.Series([0.25,0.5,0.75,1])print(data[1])0.5

通過這種索引的方法,我們輕鬆訪問到了Series的指定元素。

通過上面這段代碼,看上去,Series是不是和NumPy一維數組非常相似?但是顯得更高級一些,高級之處就在索引Series對象用一種顯式定義的索引與數值關聯,他的索引可以是任意類型:整數(任意順序)、字元串、日期類型等等。而一維NumPy數組則是隱式定義的整數索引,範圍就要窄很多了。

首先:字元串可以作為Series的索引:

import pandas as pddata = pd.Series([0.25,0.5,0.75,1], index=[aa,bb,cc,dd])print(data[bb])0.5

這裡我們顯式定義使用字元串作為Series的索引,並且可以使用實際的字元串『bb』來索引其對應的數據0.5

甚至可以進行類似的分片操作:

import pandas as pddata = pd.Series([0.25,0.5,0.75,1], index=[aa,bb,cc,dd])print(data[bb:dd])print(type(data[bb:dd]))bb 0.50cc 0.75dd 1.00dtype: float64<class pandas.core.series.Series>

分片操作返回的仍是一個Series對象,但是需要提醒一點的是這裡的分片操作和列表裡介紹過的分片是有所區別的,即:左右兩端都包含。

import pandas as pddata = pd.Series([0.25,0.5,0.75,1], index=[3,6,1,4])print(data[1])print(data[6])0.750.5

我們還可以使用亂序的整數數組來作為索引,這裡有一點需要注意,就是在索引的時候,中括弧內的整數其實指的是索引數組中的實際值,而不是位置值。

如果按我們以往使用位置值的方法來進行索引的話,反而會報錯:

import pandas as pddata = pd.Series([0.25,0.5,0.75,1], index=[3,6,1,4])print(data[0])Traceback (most recent call last): File "E:/12homework/12homework.py", line 5, in <module> print(data[0]) File "C:Python34libsite-packagespandascoreseries.py", line 603, in __getitem__ result = self.index.get_value(self, key) File "C:Python34libsite-packagespandasindexesase.py", line 2169, in get_value tz=getattr(series.dtype, tz, None)) File "pandasindex.pyx", line 98, in pandas.index.IndexEngine.get_value (pandasindex.c:3557) File "pandasindex.pyx", line 106, in pandas.index.IndexEngine.get_value (pandasindex.c:3240) File "pandasindex.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandasindex.c:4279) File "pandassrchashtable_class_helper.pxi", line 404, in pandas.hashtable.Int64HashTable.get_item (pandashashtable.c:8564) File "pandassrchashtable_class_helper.pxi", line 410, in pandas.hashtable.Int64HashTable.get_item (pandashashtable.c:8508)KeyError: 0

Series也可以看做是一種特殊的字典類型,可以把索引看做是一組鍵,然後將其一一映射到後面的一組值上,因此Series也可以用字典來生成。

import pandas as pda_dict = { AAA:23423, BBB:43422, CCC:3334}a_ser = pd.Series(a_dict)print(a_ser)print(a_ser[BBB])AAA 23423BBB 43422CCC 3334dtype: int6443422

所以,Series索引的過程可以看作是鍵的索引過程,這樣就更容易理解了。

最後介紹一個小的技巧,在用字典生成Series的過程中,可以額外增加一個索引參數作為過濾條件,如果索引參數index中含有字典中不存在的鍵,則新生成的Series會含有一個對應值為空的項。

import pandas as pda_dict = { AAA:23423, BBB:43422, CCC:3334}a_ser = pd.Series(a_dict,index=[AAA,CCC])b_ser = pd.Series(a_dict,index=[BBB,DDD])print(a_ser)print(b_ser)AAA 23423CCC 3334dtype: int64BBB 43422.0DDD NaNdtype: float64

今天就到這裡,這一集並沒有涵蓋Series類型的所有內容,只不過是作為一個引子,讓大家對Series數據類型有一個大致的認識,後面兩集介紹DataFrame和Index類型時,也是這種思路,細節會在大家對這三者有了初步了解後再一步步深入展開。


推薦閱讀:

POINT問答 | Out join
R之重抽樣與自助法(一)
數據分析階段性總結
【原創】如何做用戶生命周期價值分層,這裡有最詳細的步驟!
沒有比腳更長的路,沒有比人更高的山

TAG:Python | 數據分析 | 數據清洗 |