首先,需要先安裝numpy和pandas環境,參考: https://pandas.pydata.org/
。以下語句檢查並確認安裝成功。
Pandas 有三種基本數據結構:Series、DataFrame 和 Index。
Pandas 的 Series 對象是壹個帶索引數據構成的壹維數組。Series 對象將壹組數據和壹組索引綁定在壹起,我們可以通過 values 屬性和 index 屬性獲取數據。values 屬性返回的結果與 NumPy 數組類似;index 屬性返回的結果是壹個類型為 pd.Index 的類數組對象。
可以像訪問Numpy那樣來訪問Series(序號也是從0開始計數的)。
Pandas 的 Series 對象比Numpy更加靈活、通用。
兩者的主要區別是:NumPy 數組通過 隱式定義 的整數索引獲取數值,而 Pandas 的 Series 對象用壹種 顯式定義 的索引與數值關聯。也就是說,Numpy的索引是系統自分配的無法更改,但是Series對象是可以手工指定的。
Series是 特殊的字典 ,Series 對象其實是壹種將類型鍵映射到壹組類型值的數據結構,Pandas Series 的類型信息使得它在某些操作上比 Python 的字典更高效。用字典創建 Series 對象時,其索引默認 按照順序排列 。
DataFrame類似於RDBMS中的Table。DataFrame就可以看作是壹種既有靈活的行索引,又有靈活列名的二維數組。
DataFrame有2個常用屬性,分別是 index 屬性 和 columns 屬性 。前者可以獲取索引標簽(行標簽);後者是是存放列標簽的Index 對象。DataFrame 是特殊的字典,壹列映射壹個Series 的數據。
DataFrame可以通過以下幾種方式來創建:(1)通過單個 Series 對象創建。(2)通過字典列表創建。(3)通過 Series 對象字典創建。(4)通過NumPy 二維數組創建。(5)通過 NumPy 結構化數組創建。
可以將Index視為壹個不可變數組或有序集合。當作為不可變數組時,壹般數組的訪問方式(例如切片等)對Index適用,與數組的最大區別是 Index對象不可更改 。當作為集合時,Index也可以做交集、並集等常規操作。
Series的訪問既可以作為字典,也可以作為壹維數組。數據訪問的方法,可以參考Numpy的訪問方式,這裏不贅述。
如果Series的顯式索引是整數,那麽在訪問時,很容易混淆。例如下邊的例子:
從上邊的例子總結得出,python的默認規則是:在單個訪問時,使用的顯式索引,而在切片時,使用的是隱式索引,很容易混淆!python提供了loc、iloc和ix三種索引器。
loc表示:表示取值和切片都是顯式的。iloc 屬性,表示取值和切片都是隱式索引。ix是loc和iloc的混合形式,應用於dataFrame(使用例子在3.3節)。
dataframe可以通過對列名進行字典形式(dictionary-style)的取值獲取數據。可以把 DataFrame 看成是壹個增強版的二維數組,用 values 屬性按行查看數組數據。ix 索引器對於整數索引的處理和之前在 Series 對象中介紹的壹樣,都容易讓人混淆。
對於壹元運算(像函數與三角函數),這些通用函數將在輸出結果中保留索引和列標簽(很簡單,所有元素做相應運算並返回);而對於二元運算(如加法和乘法),Pandas 在傳遞通用函數時會自動 對齊索引 進行計算。
當在兩個 Series 或 DataFrame 對象上進行二元計算時,Pandas 會在計算過程中對齊兩個對象的索引。如果想給缺失數值指定壹個默認值,需要使用add來替代+,並指定fill_value:
兩個對象的行列索引可以是不同順序的,結果的索引會自動按順序排列。
DataFrame 和 Series 的運算規則,與NumPy 中二維數組與壹維數組的運算規則是壹樣的。需要使用廣播原則,那麽默認地,會按行計算。如果想要按列運算,需要使用參數axis = 0 。
註意:DataFrame訪問行可以使用loc,但是訪問列,只能是df['col']這種形式了。
缺失值有三種形式:null、NaN 或 NA。
處理缺失值,壹般有兩種方法:壹種方法是通過壹個覆蓋全局的掩碼表示缺失值,另壹種方法是用壹個標簽值(sentinel value)表示缺失值。
掩碼是利用壹個跟原來壹樣大小的矩陣,用0或者1表示某個元素缺失。標簽值是利用壹個特殊字符例如NaN表示缺失。
Pandas 選擇用標簽方法表示缺失值,包括兩種 Python 原有的缺失值: 浮點數據類型(包括整型) 的 NaN 值,以及 Python的 None 對象 。
使用None時,表示壹個空的python對象,所以numpy的dtype=object,因為是對象所以在進行大批量計算時,效率會比標量低。使用np.nan時表示標量,效率會高很多。
對於缺失值,pandas提供了幾個有用的API方法,分別是:isnull(),notnull(),dropna(),fillna()。其中,對於dataframe,dropna()方法默認會將包含NaN的整行都drop掉,如果想按照整列drop,增加axis=1參數。
pandas的MultiIndex提供了多級索引的功能,用元組表示是多級索引的基礎。
下面例子,使用元組索引生成Series。篩選2019的索引,非常繁瑣。
Pandas 的 MultiIndex 類型提供多種實現方法,下邊例子使用元組表示實現。
unstack() 方法可以快速將壹個多級索引的 Series 轉化為普通索引的DataFrame。stack() 方法實現相反的效果。
總結壹下,創建多級索引的方法包括:
(1)通過壹個有不同等級的若幹簡單數組組成的列表來構建 MultiIndex:pd.MultiIndex.from_arrays。
(2) 多個索引值的元組構成的列表創建 MultiIndex:pd.MultiIndex.from_tuples。
(3)用兩個索引的笛卡爾積創建MultiIndex:pd.MultiIndex.from_product。
(4)直接提供 levels和labels創建 MultiIndex(lablels是指每個級別的整數指定每個位置):
上邊的例子中,不管是Series還是DataFrame都是按照行來進行多級索引,其實,也可以按列索引,而且非常簡單,下邊是壹個例子(幾個學生在2018和2019兩次考試的不同科目成績):
需要對多級索引做顯示切片操作時,可以使用pd.IndexSlice對象來切,不同級別的維度,拿逗號分割,例如下邊例子中的df_sd_003.loc[idx_sd[2018,:],idx_sd['Alice',:]]。其他切片和取值操作與Numpy很類似。
如果 MultiIndex 不是有序的索引,那麽大多數切片操作都會失敗。
如果Series或者DataFrame的索引是未排序的,可以簡單地通過sort_index方法來快速排序。
層級數據維度轉換的另壹種方法是行列標簽轉換,可以通過reset_index 方法實現
通過pd.concat()實現pandas對象合並,pd.cancat的所有參數(下面列舉的是這些參數的默認值):
pd.concat() 可以簡單地合並壹維的 Series 或 DataFrame 對象,與
np.concatenate() 合並數組壹樣。
DataFrame 的合並默認都是逐行進行的(axis=0);pd.concat在合並時會保留索引,即使索引是重復的!如果設置 verify_integrity=True,那麽生成重復索引時,會觸發異常!有時索引無關緊要,那麽合並時就可以忽略它們,可以通過設置 ignore_index 參數來實現。默認的合並方式是對所有輸入列進行並集合並(join='outer'),當然也可以用 join='inner' 實現對輸入列的交集合並。下面是壹個實現合並的例子:
Pandas 的基本特性之壹就是高性能的內存式數據連接(join)與合並(merge)操作。
pd.merge() 實現的功能基於關系代數(relational algebra)的壹部分。 pd.merge() 函數實現了三種數據連接的類型:壹對壹、多對壹和多對多。pd.merge()會自動識別2個dataframe***有的列,並以這個列進行關聯。
上邊的例子中,關聯的兩個dataframe具有相同名稱的列,pandas會直接按同名列合並,由於兩個輸入要合並的列通常都不是同名的,因此 pd.merge() 提供了壹些參數處理這個問題。
1.最簡單的方法就是直接將參數 on 設置為壹個列名字符串或者壹個包含多列名稱的列表,這個參數只能在兩個 DataFrame 有***同列名的時候才可以使用。