1. 程式人生 > >python之pandas簡單介紹及使用

python之pandas簡單介紹及使用

一、  Pandas簡介

1、Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。Pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。pandas提供了大量能使我們快速便捷地處理資料的函式和方法。你很快就會發現,它是使Python成為強大而高效的資料分析環境的重要因素之一。

2、Pandas 是python的一個數據分析包,最初由AQR Capital Management於2008年4月開發,並於2009年底開源出來,目前由專注於Python資料包開發的PyData開發team繼續開發和維護,屬於PyData專案的一部分。Pandas最初被作為金融資料分析工具而開發出來,因此,pandas為時間序列分析提供了很好的支援。 Pandas的名稱來自於面板資料(panel data)和python資料分析(data analysis)。panel data是經濟學中關於多維資料集的一個術語,在Pandas中也提供了panel的資料型別。

3、資料結構:

Series:一維陣列,與Numpy中的一維array類似。二者與Python基本的資料結構List也很相近,其區別是:List中的元素可以是不同的資料型別,而Array和Series中則只允許儲存相同的資料型別,這樣可以更有效的使用記憶體,提高運算效率。Time- Series:以時間為索引的Series。DataFrame:二維的表格型資料結構。很多功能與R中的data.frame類似。可以將DataFrame理解為Series的容器。以下的內容主要以DataFrame為主。Panel :三維的陣列,可以理解為DataFrame的容器。Pandas 有兩種自己獨有的基本資料結構。讀者應該注意的是,它固然有著兩種資料結構,因為它依然是 Python 的一個庫,所以,Python 中有的資料型別在這裡依然適用,也同樣還可以使用類自己定義資料型別。只不過,Pandas 裡面又定義了兩種資料型別:Series 和 DataFrame,它們讓資料操作更簡單了。二、  Pandas安裝
因為pandas是python的第三方庫所以使用前需要安裝一下,直接使用pip install pandas 就會自動安裝pandas以及相關元件。

三、  Pandas使用

注:本次操作是在ipython中進行

1、匯入pandas模組並使用別名,以及匯入Series模組,以下使用基於本次匯入。

In [1]: from pandas import Series

In [2]: import pandas as pd

2、Series

Series 就如同列表一樣,一系列資料,每個資料對應一個索引值。

Series 就是“豎起來”的 list:

In [3]: s = Series([1,4,'ww','tt'])

In [4]: s
Out[4]:
0   1
1   4
2   ww
3   tt
dtype: object

另外一點也很像列表,就是裡面的元素的型別,由你任意決定(其實是由需要來決定)。

這裡,我們實質上建立了一個 Series 物件,這個物件當然就有其屬性和方法了。比如,下面的兩個屬性依次可以顯示 Series 物件的資料值和索引:

In [5]: s.index
Out[5]: RangeIndex(start=0, stop=4, step=1)

In [8]: s.values
Out[8]: array([1, 4, 'ww', 'tt'], dtype=object)

列表的索引只能是從 0 開始的整數,Series 資料型別在預設情況下,其索引也是如此。不過,區別於列表的是,Series 可以自定義索引

In [9]: s2 = Series(['wangxing','man',24],index=['name','sex','age'])

In [10]: s2
Out[10]:
name    wangxing
sex       man
age      24
dtype: object

每個元素都有了索引,就可以根據索引操作元素了。還記得 list 中的操作嗎?Series 中,也有類似的操作。先看簡單的,根據索引檢視其值和修改其值

In [12]: s2['name']
Out[12]: 'wangxing'

In [45]: s2['name'] = 'wudadiao'

In [46]: s2
Out[46]:
name    wudadiao
sex    man
age   24
dtype: object

這是不是又有點類似 dict 資料了呢?的確如此。看下面就理解了。

讀者是否注意到,前面定義 Series 物件的時候,用的是列表,即 Series() 方法的引數中,第一個列表就是其資料值,如果需要定義 index,放在後面,依然是一個列表。除了這種方法之外,還可以用下面的方法定義 Series 物件:

In [13]: sd = {'python':9000,'c++':9001,'c#':9000}

In [14]: s3 = Series(sd)

In [15]: s3
Out[15]:
c#    9000
c++    9001
python   9000
dtype: int64

現在是否理解為什麼前面那個類似 dict 了?因為本來就是可以這樣定義的

這時候,索引依然可以自定義。Pandas 的優勢在這裡體現出來,如果自定義了索引,自定的索引會自動尋找原來的索引,如果一樣的,就取原來索引對應的值,這個可以簡稱為“自動對齊”。

In [16]: s4 = Series(sd,index=['java','c++','c#'])

In [17]: s4
Out[17]:
java    NaN
c++    9001.0
c#    9000.0
dtype: float64

在 Pandas 中,如果沒有值,都對齊賦給 NaN。

Pandas 有專門的方法來判斷值是否為空。

In [19]: pd.isnull(s4)
Out[19]:
java    True
c++   False
c#    False
dtype: bool

此外,Series 物件也有同樣的方法:

In [20]: s4.isnull()
Out[20]:
java    True
c++   False
c#    False
dtype: bool

其實,對索引的名字,是可以從新定義的:

In [21]: s4.index = ['語文','數學','English']

In [22]: s4
Out[22]:
語文    NaN
數學   9001.0
English    9000.0
dtype: float64

對於 Series 資料,也可以做類似下面的運算(關於運算,後面還要詳細介紹):

In [23]: s4 * 2
Out[23]:
語文    NaN
數學    18002.0
English    18000.0
dtype: float64

In [24]: s4[s4 > 9000]
Out[24]:
數學 9001.0
dtype: float64

Series就先簡要寫到這,下面看pandas的另一種資料結構DataFrame.

DataFrame

DataFrame 是一種二維的資料結構,非常接近於電子表格或者類似 mysql 資料庫的形式。它的豎行稱之為 columns,橫行跟前面的 Series 一樣,稱之為 index,也就是說可以通過 columns 和 index 來確定一個主句的位置。

首先來匯入模組

In [27]: from pandas import Series,DataFrame

In [26]: data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}

In [28]: f1 = DataFrame(data)

In [29]: f1
Out[29]:
  marks   name    price
0    100    google    1
1    200    baidu    2
2   300    yahoo    3

這是定義一個 DataFrame 物件的常用方法——使用 dict 定義。字典的“鍵”("name","marks","price")就是 DataFrame 的 columns 的值(名稱),字典中每個“鍵”的“值”是一個列表,它們就是那一豎列中的具體填充資料。上面的定義中沒有確定索引,所以,按照慣例(Series 中已經形成的慣例)就是從 0 開始的整數。從上面的結果中很明顯表示出來,這就是一個二維的資料結構(類似 excel 或者 mysql 中的檢視效果)。

上面的資料顯示中,columns 的順序沒有規定,就如同字典中鍵的順序一樣,但是在 DataFrame 中,columns 跟字典鍵相比,有一個明顯不同,就是其順序可以被規定,向下面這樣做:

In [31]: f2 = DataFrame(data,columns=['name','price','marks'])

In [32]: f2
Out[32]:
  name    price    marks
0  google   1        100
1  baidu    2         200
2  yahoo   3         300

跟 Series 類似的,DataFrame 資料的索引也能夠自定義

In [35]: f3 = DataFrame(data,columns=['name','marks','price'],index=['a','b','c'])

In [36]: f3
Out[36]:
  name    marks    price
a   google      100        1
b     baidu          200       2
c     yahoo         300            3

定義 DataFrame 的方法,除了上面的之外,還可以使用“字典套字典”的方式。

In [40]: newdata = {'lang':{'first':'python','second':'java'},'price':{'first':5000,'second':2000}}

In [41]: f4 = DataFrame(newdata)

In [42]: f4
Out[42]:
    lang    price
first   python   5000
second   java    2000

在字典中就規定好數列名稱(第一層鍵)和每橫行索引(第二層字典鍵)以及對應的資料(第二層字典值),也就是在字典中規定好了每個資料格子中的資料,沒有規定的都是空。

DataFrame 物件的 columns 屬性,能夠顯示素有的 columns 名稱。並且,還能用下面類似字典的方式,得到某豎列的全部內容(當然包含索引):
>>> newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}} 
>>> f4 = DataFrame(newdata) 
>>> f4 
              lang     price 
firstline     python   8000 
secondline    java     NaN 
>>> DataFrame(newdata, index=["firstline","secondline","thirdline"]) 
              lang     price 
firstline     python   8000 
secondline    java     NaN 
thirdline     NaN      NaN 

DataFrame 物件的 columns 屬性,能夠顯示素有的 columns 名稱。並且,還能用下面類似字典的方式,得到某豎列的全部內容(當然包含索引):

In [44]: f3['name']
Out[44]:
a google
b baidu
c yahoo
Name: name, dtype: object

下面操作是給同一列賦值

newdata1 = {'username':{'first':'wangxing','second':'dadiao'},'age':{'first':24,'second':25}}

In [67]: f6 = DataFrame(newdata1,columns=['username','age','sex'])

In [68]: f6
Out[68]:
  username    age    sex
first wangxing    24    NaN
second dadiao   25    NaN

In [69]: f6['sex'] = 'man'

In [70]: f6
Out[70]:
  username  age    sex
first wangxing   24    man
second dadiao   25    man

可以單獨的賦值,除了能夠統一賦值之外,還能夠“點對點”新增數值,結合前面的 Series,既然 DataFrame 物件的每豎列都是一個 Series 物件,那麼可以先定義一個 Series 物件,然後把它放到 DataFrame 物件中。如下:

ssex = Series(['男','女'],index=['first','second'])

In [72]: f6['sex'] = ssex

In [73]: f6
Out[73]:
  username    age   sex
first wangxing     24      男
second dadiao    25    女

還可以更精準的修改資料嗎?當然可以,完全仿照字典的操作:

In [74]: f6['age']['second'] = 30

In [75]: f6
Out[75]:
  username    age    sex
first wangxing    24          男
second dadiao   30     女

參考http://wiki.jikexueyuan.com/project/start-learning-python/312.html所整理。