《利用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=stateframe3values屬性也會以二維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










