Pandas的兩個主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame
Series
Series 是一種類似于一維數(shù)組的對象,它由一組數(shù)據(jù)(各種NumPy數(shù)據(jù)類型)以及一組與之相關(guān)的數(shù)據(jù)標簽(即索引)組成。僅由一組數(shù)據(jù)即可產(chǎn)生最簡單的Series
obj = Series([4, 7, -5, 3])
Series 的字符串表現(xiàn)形式為:索引在左邊,值在右邊
可以通過Series的values和index屬性獲取其數(shù)組表示形式和索引對象:
obj.values
obj.index
通常,我們希望所創(chuàng)建的Series帶有一個可以對各個數(shù)據(jù)點進行標記的索引:
obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
與普通Numpy數(shù)組相比,可以通過索引的方式選取Series中的單個或一組值:
obj2['a']
還可以將Series看成是一個定長的有序字典,因為它是索引值到數(shù)據(jù)值的一個映射。它可用用在許多原本需要字典參數(shù)的函數(shù)中
'b' in obj2
如果數(shù)據(jù)被存放在一個Python字典中,也可以直接通過這個字典來創(chuàng)建Series:
sdata = {'Ohio':3500, 'Texas': 71000, 'Oregon':16000, 'Utah':5000}
obj3 = Series(sdata)
如果只傳入一個字典,則結(jié)果Series中的索引就是原字典的鍵(有序排列)
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index=states)
pandas的isnull和notnull函數(shù)可用于檢測缺失數(shù)據(jù)
Series也有類似實例方法:
obj4.isnull()
Series最重要的一個功能是:它在算術(shù)運算中會自動對齊不同索引的數(shù)據(jù)
Series對象本身及其索引都有一個name屬性,該屬性跟pandas其他的關(guān)鍵功能關(guān)系非常密切:
obj4.name = "population"
obj4.index.name = 'state'
Series的索引可以通過賦值的方式就地修改
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
DataFrame
DataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型(數(shù)值、字符串、布爾值等)。DataFrame既有行索引也有列索引,可以被看作由Series組成的字典(共用同一個索引)。DataFrame中面向行和面向列的操作基本上是平衡的。
其實,DataFrame中的數(shù)據(jù)是以一個或多個二維塊存放的(而不是列表、字典或別的一維數(shù)據(jù)結(jié)構(gòu))
構(gòu)建DataFrame的辦法有很多,最常用的一種是直接傳入一個由等長列表或Numpy數(shù)組組成的字典:
data = {'state':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2008, 2009, 2010, 2019],
'pop':[1.5, 1.7, 2.5, 2.6, 3.9]}
frame = DataFrame(data)
DataFrame 會自動加上索引(跟Series一樣),且全部列會被有序排列
通過類似字典標記的方式或?qū)傩缘姆绞?,可以將DataFrame 的列獲取為一個Series
返回的Series擁有原DataFrame相同的索引,且其name屬性也已經(jīng)被相應地設(shè)置好了。行也可以通過位置或名稱的方式進行獲取
列可以通過賦值的方式進行修改
將列表或數(shù)組賦值給某個列時,其長度必須跟DataFrame的長度相匹配。
為不存在的列賦值會創(chuàng)建出一個新列。
對返回的Series所做的任何就地修改全都會反映到源DataFrame上。通過Series的copy方法即可顯式地復制列
另外一種常見的數(shù)據(jù)形式是嵌套字典(也就是字典的字典)
如果將它傳給DataFrame,它就會被解釋為:外層字典的鍵作為列,內(nèi)層鍵則作為行索引
索引對象
pandas的索引對象負責管理軸標簽和其他元數(shù)據(jù)(比如軸名稱等)
構(gòu)建Series或DataFrame時,所用到的任何數(shù)組或其他序列的標簽都會被轉(zhuǎn)換成一個Index
Index對象是不可修改的(immutable),因此用戶不能對其進行修改
不可修改性非常重要,因為這樣才能使Index對象在多個數(shù)據(jù)結(jié)構(gòu)之間安全共享
Index甚至可以被繼承從而實現(xiàn)特別的軸索引功能
除了長得像數(shù)組,Index的功能也類似一個固定大小的集合
每個索引都有一些方法和屬性,可用于設(shè)置邏輯并回答有關(guān)該索引所包含的數(shù)據(jù)的常見問題。
重新索引
pandas對象的一個重要方法是reindex,其作用是創(chuàng)建一個適應新索引的新對象。
對于時間序列這樣的有序數(shù)據(jù),重新索引時可能需要做一些插值處理。method選項即可達到此目的。
obj3.reindex(range(6), method='ffill')
對于DataFrame,reindex可以修改(行)索引、列,或兩個都修改。
如果僅傳入一個序列,則會重新索引行
利用ix的標簽索引功能,重新索引任務可以變得更簡潔
frame.ix[['a', 'b', 'c', 'd'], states]
丟棄指定軸上的項
丟棄某條軸上的一個或多個項很簡單,只要有一個索引數(shù)組或列表即可。由于需要執(zhí)行一些數(shù)據(jù)整理和集合邏輯,所以drop方法返回的是一個在指定軸上刪除了指定值的新對象
索引、選取和過濾
Series索引(obj[...])的工作方式類似于Numpy數(shù)組的索引,只不過Series的索引值不只是整數(shù)。
利用標簽的切片運算與普通的Python切片運算不同,其末端是包含的(inclusive)
對DataFrame進行索引其實就是獲取一個或多個列
算術(shù)運算和數(shù)據(jù)對齊
pandas最重要的一個功能是,可以對不同索引的對象進行算術(shù)運算。在將對象相加時,如果存在不同的索引對,則結(jié)果的索引就是該索引對的并集。
自動的數(shù)據(jù)對齊操作在不重疊的索引處引入了NA值。
對于DataFrame,對齊操作同時發(fā)生在行和列上。
在算術(shù)方法中填充值
在對不同索引的對象進行算術(shù)運算時,可能你希望當一個對象中某個軸標簽在另一個對象中找不到時填充一個特殊值
默認情況下,DataFrame和Series之間的算術(shù)運算會將Series的索引匹配到DataFrame的列,然后沿著行一直向下廣播(broadcasting)
函數(shù)應用和映射
將函數(shù)應用到由各列或行所形成的一維數(shù)組上。DataFrame的apply方法即可實現(xiàn)此功能
元素級的Python函數(shù)也是可用的。如果想得到frame中各個浮點值的格式化字符串,使用applymap即可
排序和排名
根據(jù)條件對數(shù)據(jù)集排序(sorting)也是一種重要的內(nèi)置運算。要對行或列索引進行排序(按字典順序),可使用sort_index方法,將返回一個已排序的新對象。
排名(ranking)跟排序關(guān)系密切,且它會增設(shè)一個排名值(從1開始,一直到數(shù)組中有效數(shù)據(jù)的數(shù)量)。
帶有重復值的軸索引
索引的is_unique屬性可以告訴你它的值是否是唯一的
對于帶有重復值的索引,數(shù)據(jù)選取的行為將會有些不同。
匯總和計算描述統(tǒng)計
相關(guān)系數(shù)與協(xié)方差
Series的Corr方法用于計算兩個Series中的重疊的、非NA的、按索引對齊的值的相關(guān)系數(shù)。
cov用于計算協(xié)方差
DataFrame的corr、cov方法將以DataFrame的形式返回完整的相關(guān)系數(shù)或協(xié)方差矩陣
利用DataFrame的corrwith方法,你可以計算其列或行跟另一個Series或DataFrame之間的相關(guān)系數(shù)。
唯一值、值計數(shù)以及成員資格
第一個函數(shù)是unique,可以得到Series中的唯一值數(shù)組
value_counts用于計算一個Series中各個值出現(xiàn)的頻率
value_counts還是一個頂級pandas方法,可用于任何數(shù)組或序列
pd.value_counts(obj.values, sort=False)
isin 用于判斷矢量化集合的成員資格,可用于選取Series或DataFrame列中數(shù)據(jù)的子集
處理缺失數(shù)據(jù)
缺失數(shù)據(jù)(missing data) 在大部分數(shù)據(jù)分析應用中都很常見。
pandas使用浮點值NaN(Not a Number)表示浮點和非浮點數(shù)組中的缺失數(shù)據(jù)。
Python內(nèi)置的none也被當做NA處理
濾除缺失數(shù)據(jù)
對于一個Series,dropna返回一個僅含非空數(shù)據(jù)和索引值的Series
data.dropna()
也可以通過布爾型索引達到這個目的:
data[data.notnull()]
對于DataFrame對象,dropna默認丟棄任何含有缺失值的行
傳入how='all'將只丟棄全為NA的那些行
要用那種方式丟棄列,只需傳入axis=1即可:
data.dropna(axis=1, how='all')
填充缺失數(shù)據(jù)
對于大多數(shù)情況而言,fillna方法是最主要的函數(shù)
fillna默認會返回新對象
使用inplace=True對現(xiàn)有對象進行就地修改
df.fillna(0, inplace=True)
對reindex有效的那些插值方法也可用于fillna
層次化索引
層次化索引(heirarchical indexing)是pandas的一項重要功能,它使你能在一個軸上擁有多個(兩個以上)索引級別。它使你能以低緯度形式處理高維度數(shù)據(jù)。
對于一個DataFrame,每條軸都可以有分層索引
重排分級順序
有時需要重新調(diào)整某條軸上各級別的順序,或根據(jù)指定級別上的值對數(shù)據(jù)進行排序。swaplevel接受兩個級別編號或名稱,并返回一個互換了級別的新對象(但數(shù)據(jù)不會發(fā)生變化)