《利用python進行數據分析》第五章 pandas的數據結構筆記

pandas的數據結構

本節主要講解練習兩個主要數據結構:Series和DataFrame。

Series

Series是一種類似於一維數組的對象,它由一組數據(各種NumPy數據類型)以及一組與之相關的數據標籤(即索引)組成

from pandas import Series,DataFrameimport pandas as pdimport numpy as npobj=Series([5,8,-6,9])obj0 51 82 -63 9dtype: int64

Series的字元串表現形式:索引在左邊,值在右邊

obj.valuesarray([ 5, 8, -6, 9], dtype=int64)obj.indexRangeIndex(start=0, stop=4, step=1)

對數據點進行標記的索引

obj2=Series([5,8,-6,9],index=[d,b,a,c])obj2d 5b 8a -6c 9dtype: int64

通過索引選取單個或者一組數值

obj2[b]8obj2[b]=6obj2[[c,a,d]]c 9a -6d 5dtype: int64

Series的索引可以通過賦值的方式修改

obj.index=[老虎,猴子,獅子,大象]obj老虎 5猴子 8獅子 -6大象 9dtype: int64

數組運算

obj2d 5b 6a -6c 9dtype: int64obj2[obj2>0]d 5b 6c 9dtype: int64obj2*2d 10b 12a -12c 18dtype: int64

判斷

b in obj2Truek in obj2False

通過字典來創建Series

sdata={Ohio:36000,Texas:80000,Oregon:16000,Utah:7000}obj3=Series(sdata)obj3Ohio 36000Oregon 16000Texas 80000Utah 7000dtype: int64

如果只傳入一個字典,則結果Series中的索引就是原字典的鍵(有序排列),其中找不到的值使用NaN來表示缺失值

states=[California,Ohio,Oregon,Texas]obj4=Series(sdata,index=states)obj4California NaNOhio 36000.0Oregon 16000.0Texas 80000.0dtype: float64

pandas的isnull和notnull函數用於檢測缺失數據

pd.isnull(obj4)California TrueOhio FalseOregon FalseTexas Falsedtype: boolpd.notnull(obj4)California FalseOhio TrueOregon TrueTexas Truedtype: boolobj4.isnull()California TrueOhio FalseOregon FalseTexas Falsedtype: bool

Series在算術運算中會自動對齊不同索引的數據

obj3Ohio 36000Oregon 16000Texas 80000Utah 7000dtype: int64obj4California NaNOhio 36000.0Oregon 16000.0Texas 80000.0dtype: float64obj3+obj4California NaNOhio 72000.0Oregon 32000.0Texas 160000.0Utah NaNdtype: float64

Series對象本身及其索引都有一個name屬性

obj4.name=populationobj4.index.name=stateobj4stateCalifornia NaNOhio 36000.0Oregon 16000.0Texas 80000.0Name: population, dtype: float64

DataFrame

DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型(數值、字元串、布爾值等)

data={state:[Ohio,Ohio,Ohio,Nevada,Nevada], year:[2000,2001,2002,2001,2002], pop:[1.3,1.7,3.5,2.4,2.6]}frame=DataFrame(data)frame

按照指定順序進行排列

DataFrame(data,columns=[year,state,pop])

如果傳入的列在數據中找不到,會產生NA值

frame2=DataFrame(data,columns=[year,state,pop,debt], index=[one,two,three,four,five])frame2

將DataFrame的列獲取為一個Series

frame2[state]one Ohiotwo Ohiothree Ohiofour Nevadafive NevadaName: state, dtype: objectframe2.yearone 2000two 2001three 2002four 2001five 2002Name: year, dtype: int64

通過位置或名稱的方式進行獲取行

frame2.loc[two]year 2001state Ohiopop 1.7debt NaNName: two, dtype: object

通過賦值的方式對列進行修改

frame2[debt]=18.8frame2

frame2[debt]=np.arange(5)frame2

將列表或數組賦值給某個列時,其長度必須跟DataFrame的長度相匹配,匹配時候空位都將被填上缺失值

val=Series([-1.2,-2.8,-1.7],index=[two,four,five])frame2[debt]=valframe2

為不存在的列賦值會創建出一個新列

frame2[eastern]=frame2.state==Ohioframe2

del用於刪除列

del frame2[eastern]frame2.columnsIndex([year, state, pop, debt], dtype=object)

通過索引方式返回的列只是相應數據的視圖而已,並不是副本。因此,對返回的Series所做的任何就地修改全都會反映到源DataFrame上。

嵌套字典

外層字典的鍵作為列,內層鍵則作為行索引

pop={Nevada:{2001:2.4,2002:2.8},Ohio:{2000:1.5,2001:1.7,2002:3.6}}frame3=DataFrame(pop)frame3

轉置

frame3.T

內層字典的鍵會被合併、排序以形成最終的索引。如果顯式指定了索引,則不會這樣

DataFrame(pop,index=[2001,2002,2003])

如果設置了DataFrame的index和columns的name屬性,這些信息會被顯示

frame3.index.name=year

frame3.columns.name=state

frame3

values屬性也會以二維ndarray的形式返回DataFrame中的數據

frame3.valuesarray([[nan, 1.5], [2.4, 1.7], [2.8, 3.6]])

如果DataFrame各列的數據類型不同,則值數組的數據類型就會選用能兼容所有列的數據類型

frame2.valuesarray([[2000, Ohio, 1.3, nan], [2001, Ohio, 1.7, -1.2], [2002, Ohio, 3.5, nan], [2001, Nevada, 2.4, -2.8], [2002, Nevada, 2.6, -1.7]], dtype=object)

索引對象

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

obj=Series(range(3),index=[a,b,c])obja 0b 1c 2dtype: int64index=obj.indexindexIndex([a, b, c], dtype=object)index[1:]Index([b, c], dtype=object)

Index對象是不可修改(immutable)

index[1]=k---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-30-b7df0891da73> in <module>()----> 1 index[1]=ke:pythonlibsite-packagespandascoreindexesbase.py in __setitem__(self, key, value) 1722 1723 def __setitem__(self, key, value):-> 1724 raise TypeError("Index does not support mutable operations") 1725 1726 def __getitem__(self, key):TypeError: Index does not support mutable operations

不可修改性非常重要,因為這樣才能使Index對象在多個數據結構之間安全共享

index=pd.Index(np.arange(3))indexInt64Index([0, 1, 2], dtype=int64)obj2=Series([1.5,-2.5,0],index=index)obj20 1.51 -2.52 0.0dtype: float64obj2.index is indexTrue


推薦閱讀:

python numpy的樣本標準差怎麼寫?
ImagePy教程 —— 擴展功能
《Python for Data Analysis》書中Pythonic寫法
Python C Extesion (pyd)
int class, a.__int__(), np.shape, a.shape, np.zeros, np.arange

TAG:Python | numpy | 數據分析 |