1. 程式人生 > >python pandas庫的學習筆記一pandas的資料結構

python pandas庫的學習筆記一pandas的資料結構

要使用pandas,首先要熟悉他的兩個主要的資料結構:Series和DataFrame。

一、Series

Series 是一種類似於一維陣列的物件,由一組資料(各種numpy資料型別)以及一組與之相關的資料標籤(即索引)組成。
僅由一組資料即可產生最簡單的Series:

>>> from pandas import Series,DataFrame
>>> import pandas as pd
>>> obj=pd.Series([4,7,-5,3])
>>> obj
0    4
1    7
2   -5
3    3
dtype: int64
左邊是索引,右邊是值,這樣看起來Series好像更像dict或map這一類具有鍵值對的結構。
>>> obj.values #值
array([ 4,  7, -5,  3], dtype=int64)
>>> obj.index #索引物件
RangeIndex(start=0, stop=4, step=1)
分別獲得值物件與索引物件。

手動指定索引

>>> obj1=Series([4,7,-5,3],index=['a','b','d','c'])
>>> obj1
a    4
b    7
d   -5
c    3
dtype: int64
通過索引取值:
>>> obj1['a']
4
>>> obj1[['a','d','b']] #獲取多個值
a    4
d   -5
b    7
dtype: int64
陣列運算:
>>> obj1[obj1>0]
a    4
b    7
c    3
dtype: int64
>>> obj1*2
a     8
b    14
d   -10
c     6
dtype: int64
既然Series的結構很像dict,自然也可以通過一個dict去建立Series
>>> sdata={'ohio':3500,'Texas':710,'Utah':500}
>>> obj2=Series(sdata)
>>> obj2
Texas     710
Utah      500
ohio     3500
dtype: int64
name屬性,Series物件本身及其索引都有一個name屬性
>>> obj2.index.name='state'
>>> obj2.name='population'
>>> obj2
state       #索引名
Texas     710
Utah      500
ohio     3500
Name: population, dtype: int64 #Series名

二.DataFrame

    DataFrame是一個表格型的資料結構,含有一組有序的列,每列可以是不同的值型別(數值,字串,布林值等)。DataFrame既有行索引也有列索引,可以被看做是由Series組成的字典。DataFrame中的資料是以一個或多個二維塊存放的。

構建DataFrame

>>> data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}
>>> frame=DataFrame(data)
>>> frame
   pop   state  year
0  1.5    Ohio  2000
1  1.7    Ohio  2001
2  3.6    Ohio  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002
結果會自動加上索引,且全部列被有序排列,注意是列被有序排列,即根據列名有序排列。

指定列的順序

>>> DataFrame(data,columns=['year','state','pop'])
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9
如果傳入的列找不到,則會產生NAN
>>> frame2=DataFrame(data,columns=['year','state','pop','debt'] ,index=['one','two','three','four','five'])
>>> frame2
       year   state  pop debt
one    2000    Ohio  1.5  NaN
two    2001    Ohio  1.7  NaN
three  2002    Ohio  3.6  NaN
four   2001  Nevada  2.4  NaN
five   2002  Nevada  2.9  NaN
取值,通過類似陣列或屬性的方式,可以獲取某一列的資料(為一個Series)
>>> frame2['state'] #類似陣列的方式
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
Name: state, dtype: object
>>> frame2.year #類似屬性的方式
0    2000
1    2001
2    2002
3    2001
4    2002
Name: year, dtype: int64
注意,返回的Series擁有原DataFrame相同的索引,且其name屬性也已經被相應的設定好了。
獲取行,行也可以通過位置或名稱的方式來進行獲取,比如用索引欄位ix
>>> frame2.ix[2]
year     2002
state    Ohio
pop       3.6
debt      NaN
Name: 2, dtype: object
列可以通過賦值的方式進行修改。如下,我們可以給空的”debt“列賦值一個標量或一組值。
>>> import numpy as np
>>> frame2['dept']=np.arange(5) #為不存在的列賦值會建立一個新列
>>> frame2['debt']=12
>>> frame2
   year   state  pop  debt  dept
0  2000    Ohio  1.5    12     0
1  2001    Ohio  1.7    12     1
2  2002    Ohio  3.6    12     2
3  2001  Nevada  2.4    12     3
4  2002  Nevada  2.9    12     4
刪除,關鍵詞del用於刪除列
>>> del frame2['pop']
>>> frame2
   year   state  debt  dept
0  2000    Ohio    12     0
1  2001    Ohio    12     1
2  2002    Ohio    12     2
3  2001  Nevada    12     3
4  2002  Nevada    12     4
另一種常見的資料形式是巢狀字典(也就是字典的字典),將它傳給DataFrame,就會被解釋為:外層字典的鍵作為列,內層鍵作為行索引。
>>> pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7, 2002:3.6}}
>>> frame3=DataFrame(pop) #使用巢狀字典構造DataFrame
>>> frame3
      Nevada  Ohio
2000     NaN   1.5
2001     2.4   1.7
2002     2.9   3.6
對結果進行 轉置:
>>> frame3.T
        2000  2001  2002
Nevada   NaN   2.4   2.9
Ohio     1.5   1.7   3.6
設定index和columns的name屬性:
>>> frame3.index.name='year'
>>> frame3.columns.name='state'
>>> frame3
state  Nevada  Ohio
year
2000      NaN   1.5
2001      2.4   1.7
2002      2.9   3.6

可以用於構造DataFrame的資料:

三、索引物件

    pandas的索引物件負責管理標籤和其他元資料(比如軸名稱等)。構建Series或DataFrame時,所用到的任何陣列或其他序列的標籤都會被轉換成一個Index:

>>> obj=Series(range(3),index=['a','b','c'])
>>> obj.index
Index([u'a', u'b', u'c'], dtype='object')
Idex物件是不可修改的,因此使用者不能對其修改。不可修改性非常重要,因為這樣才能使得index物件在多個數據結構之間安全共享:
>>> index=pd.Index(np.arange(3))
>>> obj2=Series([1.5,-2.5,0],index=index)
>>> obj2.index is index
True

index的方法和屬性:


參考:

《利用python進行資料分析》