利用Python進行數據分析<.第二版>筆記基礎二之Pandas
【注】:此篇內容爲作者整理補充,書籍中可能順序有些差別。
(聲明:本教程僅供本人學習使用,如有人使用該技術觸犯法律與本人無關)
(如果有錯誤,還希望指出。共同進步)
Pandas層次化索引
創建多層行索引
1、隱式構造
Series:(二層索引)
DataFrame:
(三層索引):
2、顯示構造pd.MultiIndex
1、使用數組:pd.MultiIndex.from_arrays()
2、使用tuple:pd.MultiIndex.from_tuples()
3、使用product:pd.MultiIndex.from_product()
多層列索引
除了行索引Index,列索引columns也能用同樣的方法創建多層索引
【注】:numpy.random.randint(0,100,size=8)表示8行一列;size=(1,8)表示一行8列
多層索引對象的索引與切片操作
1、Series的操作
【重要】對於Series來說,直接中括號[]與使用.loc()完全一樣,因此,推薦使用中括號索引和切片。
2、DataFrame的操作
(1) 可以直接使用列名稱來進行列索引
(2) 使用行索引需要用ix(),loc()等函數
【極其重要】推薦使用loc()函數
注意在對行索引的時候,若一級行索引還有多個,對二級行索引會遇到問題!也就是說,無法直接對二級索引進行索引,必須讓二級索引變成一級索引後才能對其進行索引!只能行切片
索引的堆(stack)
stack():列索引放到行索引上面
unstack():行索引放到列索引上面
【小技巧】
使用stack()的時候,level等於哪一個,哪一個就消失,出現在行裏。
使用unstack()的時候,level等於哪一個,哪一個就消失,出現在列裏。
where(條件):對數據的過濾,other用來指定不滿足條件的參數
Pandas數據處理
1、刪除重複元素
使用**duplicated()函數檢測重複的行,返回元素爲布爾類型的Series對象,每個元素對應一行,如果該行不是第一次出現,則元素爲True
使用drop_duplicates()**函數刪除重複的行
2. 映射
映射的含義:創建一個映射關係列表,把values元素和一個特定的標籤或者字符串綁定
需要使用字典:
map = { 'label1':'value1', 'label2':'value2', ... }
replace()函數:替換元素
map()函數:
【*】:(常用)新建一列(由已有的列生成一個新列,或者修改當前列)
map函數的參數:
1.字典
2.lambda函數
# 新建一列
df["c"] = df["GO"].map(lambda x : x-5)
# 修改當前“GO”列
df["GO"] = df["GO"].map(lambda x : x-5)
3.回調函數
rename()函數:替換索引
仍然是新建一個字典
使用rename()函數替換行索引
3. 異常值檢測和過濾
使用describe()函數查看每一列的描述性統計量
中位數:奇數個是最中間的數,偶數個是中間兩個數的平均值
std():可以求得DataFrame對象每一列的標準差
df.drop(labels,inplace = True):刪除特定索引
4. 排序
【排序】
1、使用**.take()函數排序
2、可以藉助np.random.permutation()**函數隨機排序
# nums 指dataframe數據的行數
df.take(np.random.permutation(nums))
【隨機抽樣】
當DataFrame規模足夠大時,直接使用**np.random.randint()函數,就配合take()**函數實現隨機抽樣
# left 指隨機數據行數開始行
# right 指隨機數據行數結束行
# nums 指隨機抽樣數據的個數
df.take(np.random.randint(left, right, size=nums))
5. 數據聚合【重點】
數據聚合是數據處理的最後一步,通常是要使每一個數組生成一個單一的數值。
數據分類處理:
核心: groupby()函數
分組:先把數據分爲幾組——groupby()之後的數據是一個對象;一般後面跟上聚合操作
用函數處理:爲不同組的數據應用不同的函數以轉換數據
合併:把不同組得到的結果合併起來
Pandas的拼接操作
pandas的拼接分爲兩種:
級聯:pd.concat, pd.append
合併:pd.merge, pd.join
pd.concat()級聯
1、簡單級聯
和np.concatenate一樣,優先增加行數(默認axis=0),可以通過設置axis來改變級聯方向;【注意】index在級聯時可以重複
也可以選擇忽略ignore_index,重新索引
或者使用多層索引 keys
concat([x,y],keys=[‘x’,‘y’])
2、不匹配級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致;有3種連接方式:
–外連接:補NaN(默認模式),join=“outer”;默認
–內連接:只連接匹配的項,匹配不到的不要
–連接指定軸 join_axes
3、使用append()函數添加
由於在後面級聯的使用非常普遍,因此有一個函數append專門用於在後面添加
pd.merge()合併
merge與concat的區別在於,merge需要依據某一共同的行或列來進行合併
使用pd.merge()合併時,會自動根據兩者相同column名稱的那一列,作爲key來進行合併。
注意每一列元素的順序不要求一致
1)一對一合併(重複的保留一次)
2)多對一合併(數據總數爲:多乘一+不重複的)
3)多對多合併(數據總數:多乘多+不重複的)
4) key的規範化:
使用on=顯式指定哪一列爲key,當有多個key相同時使用,但是用法很少
suffixes用來指定合併後的列名
當有不同的列名時(數據元素類型一樣),使用left_on和right_on指定左右兩邊的列作爲key,當左右兩邊的key都不想等時使用
left_index開啓左邊表的行索引,right_index開啓右邊表的行索引,類似級聯
內合併與外合併,how=“inner/outer/left/right”
內合併:只保留兩者都有的數據(默認模式)
外合併:數據沒有的補上Nan
左合併:左邊表的數據一個都不能少,即使不上Nan也不能把數據丟掉
右合併:右邊表的數據一個都不能少,即使不上Nan也不能把數據丟掉
列衝突的解決
當列衝突時,即有多個列名稱相同時,需要使用on=來指定哪一個列作爲key,配合suffixes指定衝突列名
可以使用suffixes=自己指定後綴