筆記來源:利用python進行數據分析【Wes Mckinnney著,唐學韜等譯】
一、pandas的數據結構介紹【主要包括Series、DataFrame】
介紹:pandas名稱爲panel data(面板數據),其基於NumPy構建的
1、Series
(1)簡單構建
Series是一種類似於一維數組的對象,有一組數據(可爲NumPy數據類型)及一組與之相關的數據標籤(索引)組成,若只有一組數據,則產生的是最簡單的Series
(2)獲取值及索引屬性【.values .index】
由上述可知,Series的表現形式爲,索引在左邊,值在右邊。因爲上述沒有爲數據進行指定索引,其則會自動創建0-N-1(N爲數據長度)的整數型索引,可使用values、index屬性分別獲取Series的表達形式和索引對象。
(3)傳入自己定義的索引並取相應位置的值
創建含有自己定義的索引數據,創建內部傳入第二個參數,該參數爲index,其賦爲一個列表形式,若取其中的一個值,一層列表傳入鍵即可,如果取多個值,則兩層列表傳入多個鍵。
(4)Series 相關計算
(5)字典形式構建Series【鍵爲索引,值爲Series值】
(6)傳入字典,默認字典的鍵作爲索引,但也可重新定義索引。如下使用指定列表,傳入的列表索引如果在原字典索引中有,則返回的值即爲原索引對應的值,如果新索引在原索引中沒有,則返回結果爲NaN
【sdata中與states索引相匹配的那3個值會被找出了放到相應的位置上,但是由於‘California’所對應的sdata值找不到,返回結果爲NaN,代表確實數據】
(7)檢查是否爲缺失數據( pd.isnull() pd.notnull() ), 返回與原來相同長度的布爾型結果
(8)算術運算,自動對齊不同索引數據
(9)Series對象的name屬性與索引的name屬性【也可對索引name】
(10)Series索引直接通過賦值進行修改
2、DataFrame
DataFrame是一個表格型的數據結構,含有有序的列,每列可是不同的值類型(如:數值、字符串、布爾值等)。其既有行索引、也有列索引。可以理解爲有Series組成的字典(共同使用一個索引)
(1)創建方法
1)傳入字典,字典內再傳入列表【字典的鍵:DataFrame的列名、字典的值(列表元素):DataFrame的值】
常用的方法是直接傳入一個由等長列表或NumPy數組組成的字典。並且行索引會自動加上(從0開始).可以對列索引按照指定順序進行排序【columns關鍵字傳入】
如果原來傳入的數據已經有了列索引,我們再給其傳入列索引,那麼結果將和Series類似。即先在傳入的數據中,有則返回原來數據對應的值,無則返回NaN值。如下【原列索引含有‘year’,‘state’,‘pop’,則這三個返回原來對應的值,但是‘debt’新增的列索引名在原來數據中沒有,則返回值爲NaN】
2)字典的嵌套(字典的字典)【最外層字典的鍵:DataFrame的列名、第二次字典的鍵:DataFrame的每行索引。第二層字典的值:DataFrame的值】
顯示傳入指定索引
其中新傳入的索引沒有對應值,則返回NaN
(2)獲取指定位置的數據或對指定位置數據進行賦指定值
1)只獲取指定列數據
直接通過DataFrame列表傳入列名的形式或者.列名的方式獲取。將得到一個Series數據(返回含有行索引)
2)三種獲取指定位置數據的方式區別(.ix .loc .iloc)
loc【索引名稱】:內部傳入參數以列表形式傳入(內容是索引名稱,不能爲索引號【除非索引名稱即爲索引號】
如果loc的索引名稱即爲索引號(爲數字時),還可以進行切片操作【但這裏的切片包含第一個與最後一個![含尾索引]】
iloc【索引號】:內部傳入參數以列表形式傳入(內容是索引號,不能爲索引名稱)不管行列均用索引號【切片不含尾索引】
ix【索引名稱與索引號均可用】:是loc、iloc的結合體.可以混合使用索引名稱與索引號
提示:ix使用提示其將被棄用。以後將使用以上兩者(loc——通過行標籤索引行數據
iloc——通過行號索引行數據。)進行替代
3) 對指定列進行賦值,可以爲標量值,也可以爲一組值【這組值必須與行數相匹配】
4)對指定列進行賦值,賦值爲一個Series【如果精確匹配DataFrame的索引,則所有位置即被填充,否則爲NaN】
5)對之前爲出現的列進行賦值則會創建一個新的列,關鍵字del用於刪除列【如下''eastern"之前未出現過,則會新創建】
(3)DataFrame的index和columns的name屬性【index.name、columns.name、.values】
3、索引對象
pandas的索引對象負責管理軸標籤和其他元數據(如軸名稱等),構建Series或DataFrame時,所用到的任何數組或其他序列的標籤都會被轉換爲一個Index
謹記:Index對象是不可修改的,從而保證了其在多個數據結構件安全共享
每個索引均有一些方法和屬性。如下列出了Index的一些方法和屬性
方法 | 說明 |
append | 連接另一個Index對象,產生一個新的Index |
diff | 計算差集,得到一個Index |
intersection | 計算交集 |
union | 計算並集 |
isin | 計算一個指示各值是否都包含在參數集合中的布爾值數組 |
delete | 刪除索引i處的元素,並得到新的Index |
drop | 刪除傳入的值,並得到新的Index |
insert | 將元素插入到索引i處,並得到新的Index |
is_monotonic | 當元素均大於等於前一個元素時,即順序遞增或不變,返回True |
is_unique | 是否爲唯一值,當Index沒有重複值時,返回True |
unique | 計算Index中唯一值的數組 |
二、基本功能(p126)
1、重新索引【reindex()】
pandas對象的一個重要方法就是reindex.其主要用於創建一個適應新索引的新對象。
(1)單純的重新索引【新索引代替原索引,如果原來無該索引,則新創建的索引默認對應值爲NaN(表示缺失值)】
(2) 重新索引後,對新增的索引進行缺失值填充
1) 固定賦值填充
2)前向填充(新索引(新增)對應的值根據前一個索引(原存在)進行填充(與前一個索引相同的值),使用傳入method=‘ffill’或‘pad’)
3)後向填充(意思讓新索引(新增)對應的值根據後一個索引(原存在)進行填充(與後一個索引相同的值),使用傳入method=‘bfill’或‘backfill’)
(3) DataFrame的重新索引(可修改行、列索引)
1)當僅傳入一個序列時,重新索引行
2) 傳入列重新索引列【原有則取原值,原無則爲NaN值】
2、丟棄指定軸上的項(drop()方法)
(1)Series()相關
.drop()方法後有返回值,返回的即爲丟棄後的內容,不改變drop()之前的內容
(2)DataFrame相關
其可刪除任意軸上的索引值。【丟棄指定列,axis=1】
3、索引、選取、過濾
(1)Series索引相關【與NumPy數組索引類似,但Series索引不僅限整數】
1)取指定值
2) 使用標籤進行切片【與python切片不同,這裏標籤切片含末端元素】
(2)DataFrame相關
1) 普通索引或索引標籤取指定位置值【與上述Series類似】
2) 使用ix取指定位置的值
3)DataFrame的索引選項
類型 | 說明 |
obj[val] | 選DataFrame的單個列或一組列。如在布爾型數組(過濾行)、切片(行切片)、布爾型DataFrame時求解便利 |
obj.ix[val] | 選取DataFrame的單個行或一組行 |
obj.ix[:,val] | 選取單個列或列子集 |
obj.ix[val1,val2] | 同時選取行、列 |
reindex方法 | 將一個或多個軸匹配到新索引 |
xs方法 | 根據標籤選取單行或單列,並返回一個Series |
icol、irow方法 | 根據整數位置選取單列或單行,並返回一個Series |
get_value、set_value方法 | 根據行標籤和列標籤選取單個值 |
4、算術運算和數據對齊
pandas最重要的功能,可對不同索引的對象進行算術運算。對象相加時,存在不同索引,則結果爲索引對的並集。
(1)簡單的算術計算
1)Series
2) DataFrame
(2) 在算術方法中填充值
1) add()
2)reindex()重新索引,指定填充值
(3)DataFrame和Series之間的運算
1) 簡單NumPy數組廣播計算示例
2)DataFrame與Series之間的廣播計算也類似,如下示
3)兩者進行相加計算,索引進行求並集,但是非共同索引值爲NaN,共同索引值纔有值
4) 兩者進行相減時,按某個軸進行操作
5、函數應用和映射
NumPy的unfunc(元素級數組方法)也可以操作pandas對象
(1)np.abs()【求絕對值】
(2) .apply()的使用【將函數應用到各列或行形成一維數組】
(3)applymap() 的使用
而Series對應的應用元素級函數爲map方法
6、排序和排名
(1)按索引排序【sort_index()函數,可傳入軸向axis、順序逆序值ascending】
(2) 按數值進行排序【python2用order方法、python3用sort_values方法】
1)Series按值排序
2) DataFrame按值排序
(3)排名rank方法【會增設一個排名值,從1開始,與numpy.argsort類似】
1).rank()有返回值,不影響原來的數據。返回的值是值的排名,如有多個值,求平均排名【默認method = ‘average’】。
2)當傳入參數時method =‘first’時,不求平均排名【按原始數據中的出現順序分配排名,出現越前,排名越靠前】
3) 降序排名,則傳入參數ascending = False【即值最大排名序號越小,即最大值排名爲1】
4) 排名時用於破壞平級關係的method選項
method | 說明 |
"average" | 默認:在相等的分組中,爲各個值分配平均排名 |
"min" | 使用分組中的最小排名【可能有重複排名】 |
"max" | 使用整個分組中的最大排名【可能有重複排名】 |
"first" | 按值在原始數據中的出現順序分配排名 |
7、帶有重複值的索引
(1)索引是否爲唯一值(is_unique())
(2)按索引取值
(3)DataFrame進行行索引取值
參考:
[1]. McKinney,W.著;唐學韜等譯. 利用python進行數據分析[M]. 北京:機械工業出版社,2013.9.