筆記來源:利用python進行數據分析【Wes Mckinnney著,唐學韜等譯】
一、合併數據集
1、數據庫風格的DataFrame合併
數據集的合併(merge)和連接(join)運算是通過一個或者多個鍵進行連接起來的,這是關係型數據庫的核心。
(1)簡單merge合併
其中df1數據有多個標記a、b的行,而df2的key列每個值僅對應一行,多對一的合併
(2)基於不同列名(鍵)進行相同值合併【默認inner(交集)】
與上述類似,都是求交集。但是上述鍵相同均爲‘key’,而這裏合併的兩個df鍵名不同,但兩者含有共同鍵值(a、b)
(3)基於相同列名(鍵名(默認))進行相同鍵值合併【指定參數爲how=‘outer’(並集)】
即結果集中每個鍵值包含兩個df的所有值,有些鍵值兩者均有,但有些鍵值只有一方有。其餘一方則爲NaN
(4)基於相同鍵名,按指定某個合併項的鍵值進行多對多的合併(行數爲笛卡爾積)
指定合併項的值可以爲how=‘left’、‘right’、‘outer’、‘inner’
how即基於那邊進行合併,這裏爲left,即按左邊的鍵值進行合併,merge函數內第一個數爲df1,即爲左邊,df2爲右邊
如果指定合併爲交集,則比上述少了索引爲6的那行合併行,即df1的'key'值有值,而df2的‘key’值爲空的那項,
(5)重複列名的處理(suffixes()方法)
用於指定附加到左右兩個DataFrame對象的重疊列名上的字符串
(6)merge函數的相關參數
參數 | 說明 |
left | 參與合併的左側DataFrame |
right | 參與合併的右側DataFrame |
how
|
表示連接方式。其值可爲‘inner’、‘outer’、‘left’、‘right’其中之一,默認爲‘inner’(交集合並) |
on | 基於合併的列名。必須存在於左右兩個DataFrame對象中,如果未連指定,且其他連接鍵也沒有指定,則以left和right列名的交集作爲連接鍵 |
left_on |
左側DataFrame中用作連接鍵的列 |
right_on | 右側DataFrame中用作連接鍵的列 |
left_index | 將左側的行索引用作連接鍵 |
right_index | 將右側的行索引用作連接鍵 |
sort | 根據連接鍵對合並後的數據進行排序,默認爲True.有時在處理大數據集時,禁用該選項可獲得更好的性能 |
suffixes | 字符串值元組,用於追加到重疊列名的末尾,默認爲(‘_x’,‘_y’)。例如,如果左右兩個DataFrame對象有‘data’。則結果中就會出現‘data_x’和‘data_y’【即列名後串聯了傳入的字符串】 |
copy | 設置爲False,可在某些特殊情況下避免將數據複製到結果數據結構中。默認爲總是複製。 |
2、索引上的合併
(1)普通的索引作爲連接鍵
有時DataFrame的連接鍵位於索引中,這種情況可傳入left_index=True或right_index=True。或兩個都傳,即說明索引作爲連接鍵
上述基於左邊的DataFrame中key進行合併,a如圖所示,b也類似,即返回的索引順序與left1順序保持一致。而且默認的合併連接鍵爲交集。即兩個DataFrame具有的共同鍵值.可指定其連接方式方式爲‘outer’。
(2)層次化索引
在上述基礎上,也可以指定連接方式爲how的值爲‘outer’、‘left’、‘inner’(默認)、‘right’
如下是指定連接方式爲‘outer’ (求並集)
(3)均使用雙方索引進行合併
上述左右均按索引連接,則需要填寫left_index = True、right_index = True.比較麻煩,這裏我們可以通過join方法進行替代。
它可實現按照索引合併。並且還可用於合併多個帶有相同或相似索引的DataFrame對象,不管其是否有重疊的列。
join方法可以傳入一組DataFrame。默認join的連接方式爲左連接。並且傳多個DataFrame時,默認水平疊加,如下示
當然上述join默認連接方式爲左連接,也可以傳入指定的連接方式爲‘right’、‘outer’、‘inner’等
3、軸向連接
合併方式爲連接(concatenation)、綁定(binding)、堆疊(stacking)等
如下爲numpy的concatenation的例子
(1)pandas的concat簡單的水平疊加、垂直疊加
連接方式默認(默認爲‘outer’)與指定連接方式爲‘inner’的對比
(2) 爲合併後指定特定索引
1)單層索引【使用join_axes關鍵字】
2)層次化索引【使用keys關鍵字】
axis=0時(默認)
axis=1時【默認連接方式爲‘outer’求並集】
(3)DataFrame的concat的相關使用(與series類似)
1)增加最外層索引(層次化索引)
還可以對層次化索引進行管理,如對每一層索引加索引名
2)對合並時進行索引忽略(傳入關鍵字:ignore_index = True(默認爲False))
(4)concat函數的參數
參數 | 說明 |
objs | 參與連接的pandas對象的列或字典。唯一必須的參數 |
axis | 指明連接的軸向。默認爲0 |
join | 連接方式。一般可爲‘inner’、‘outer’其中之一,默認爲‘outer’。指明其他軸向上的索引是按交集(inner)、還是並集(outer)進行合併 |
join_axes | 指明用於其他n-1條軸的索引、不執行並集/交集運算 |
keys | 與連接對象有關的值,用於形成連接軸向上的層次化索引。可爲任意值的列表、元組數組、數組列表(如果將levels設置爲多級數組的話) |
levels | 指定用作層次化索引各級別上的索引,如果設置了keys的話,外層級別的索引 |
names | 用於創建分層級別的名稱,如果已經設置了keys和(或)levels的話 |
verify_integrity | 檢測結果對象新軸上的重複情況,如果發現則引發異常,默認(False),即允許重複 |
ignore_index |
不保留連接軸上的索引,產生一組新索引range(total_length) |
4、合併重疊數據
有一種數據組合不能單純的使用簡單的合併(merge)或連接(concatenation)運算處理,如索引部分或全部重疊的數據集。
(1)使用NumPy的where函數,效果類似if_else
(2)使用combine_first方法實現數據對齊
對於DataFrame,combine_first也會在列上做同樣的事情,所以可看做是用參數對象中數據爲調用者對象的缺失數據“打補丁”
二、重塑和軸向旋轉
重新排列表格型數據的基礎運算,這些函數也稱爲重塑(reshape)或軸向旋轉(pivot)運算
1、重塑層次化索引
stack:將數據的列‘旋轉’爲行
unstack:將數據的行‘旋轉’爲列
(1)stack、unstack的簡單使用
(2)unstack按特定級別編號進行操作
(3)unstack操作可能引入缺失數據、stack默認會濾除缺失數據,運算可逆
(4)對DataFrame進行unstack操作時,作爲旋轉軸的級別將會成爲結果中的最低級別
2、將“長格式”旋轉爲‘寬格式’
時間序列數據常以所謂的‘長格式’(long)或“堆疊格式”(stack)存儲在數據庫和csv中
三、數據轉換
過濾、清理、及其他轉換
1、移除重複數據
DataFrame中常出現衝重複行
(1)判斷是否具有重複項【.duplicated() 返回的是一個布爾型Series,判斷各行是否具有重複行】
(2)移除重複行的項【DataFrame】
1) 默認爲判斷所有列的值是否重複【這裏列有k1、k2。即判斷k1、k2值均相等時則表示爲重複行。只有一行相同不是重複行】
2) 可指定判斷列是否重複,如下只根據k1列進行過濾重複項【只有k1值相同,則判斷爲重複行】
2、利用函數或映射進行數據轉換
選擇DataFrame的某列作爲Series,再調用Series的map方法接收一個函數或含有映射關係的字典型對象。
上述結果也可通過匿名函數一次返回,如下所示
3、替換值
fillna的方法填充缺失數據可看成是值替換的一種特殊情況。replace則提供了一種實現替換更簡單、更靈活的方式。
4、重命名軸索引
(1)修改原始數據進行索引修改(直接對原索引進行賦值)
(2)不修改原始數據進行索引的修改(rename)
rename也可以就地改數據集,只需要傳入inplace = True即可
5、離散化和麪元劃分
又是便於分析,連續數據常被離散化或拆分爲面元(bin)
(1)cut的使用
1)簡單分類
2)獲取標籤及各個分類的計數
獲取標籤原使用.labels,現在已經棄用,已經改爲.codes獲取。
3)默認區間爲左開右閉,也可指定設置其開閉(如設置right=False,讓其右邊開區間,則左邊則爲閉)
4)可自行設置面元的名稱,只需將labels選項設置爲一個列表或數組即可
在沒有傳入lable時,返回的是每個被判數的區間範圍,現在加入了lables,則返回的是對應的lable值
(2)qcut的使用
類似於cut函數,可根據樣本分位數對數據進行面元劃分。根據分佈情況,cut可能無法使各個面元含有相同數量的數據點,而qcut由於使用樣本分位數,因此可得到大小基本相等的面元
與cut類似,也可以設置自定義的分位數(0到1之間的數值,包含端點)
6、檢測和過濾異常值
7、排列和隨機採樣
利用numpy.random.permutation函數可實現對Series或DataFrame的列的排序(隨機重排序)
8、計算指標/啞變量
一種常用於統計見面或機器學習的轉換方式是:將分類變量轉換爲‘啞變量矩陣’或‘指標矩陣’。若DataFrame的某一列含有k個不同的值,則可派生出一個k列矩陣或DataFrame(其值全爲1或0)。pandas有一個get_dummies函數可實現該功能
四、字符串的操作
1、字符串對象方法
方法 | 說明 |
count | 返回子串在字符串中的出現次數(非重疊) |
endswith、startswith | 如果字符串以某個後綴結尾(以某個前綴開頭),則返回True |
join | 將字符串用作連接其他字符串序列的分隔符 |
index | 如果在字符串內找到子串,則返回子串的第一個字符所在的位置,未找到,則返回異常 |
find | 與index類似,但是在其沒找到,不會引發異常,會返回-1 |
rfind | 找到子串,則返回最後一個發現的子串位置,沒找到返回-1 |
replace | 用於字符串的替換,第一個參數爲被替換的字符,第二個參數爲被替換後的子串 |
strip、rstrip、lstrip |
去除空白符(包括換行符)。相當於對各個元素執行x.strip()(及rstrip()、lstrip() ) |
split |
通過指定的分隔符將字符串拆分爲一組子串 |
lower、upper | 分別將字母字符轉換爲小寫或大寫 |
ljust、rjust | 用空格(或其他字符)填充字符串的空白側以返回符合最低寬度的字符串 |
2、正則表達式【這裏不提】
3、pandas中的矢量化的字符串函數
矢量化的字符串方法
方法 | 說明 |
cat | 實現元素級的字符串的連接操作,可指定分隔符 |
contains | 返回表示各字符串是否含有指定模式的布爾型數組 |
count | 模式的出現的次數 |
endswitch、startswith | 相當於對各個元素執行x.endswitch(pattern)或x.startswitch(pattern) |
findall | 計算各字符串的模式列表 |
get | 獲取各元素的第i個字符 |
join | 根據指定的分隔符將Series中各元素的字符串連起來 |
len | 計算各字符串的長度 |
lower、upper | 轉換大小寫,相當於對各個元素執行x.lower()或x.upper() |
match | 根據指定的正則表達式對各個元素執行re.match |
pad | 在字符串的左、右、或左右兩邊添加空白符 |
center | 相當於pad(side='both') |
repeat | 重複值,例如:s.str.repeat(3)相當於對各個字符串執行x*3 |
replace | 用於指定字符串替換找到的模式 |
slice | 對Series中的各個字符串進行子串截取 |
split | 根據分隔符或正則表達式對字符串進行拆分 |
strip、rstrip、lstrip | 去除空白符,包括換行符,相當於對各個元素執行x.strip()、x.rstrip()、x.lstrip() |
參考:
[1]. McKinney,W.著;唐學韜等譯. 利用python進行數據分析[M]. 北京:機械工業出版社,2013.9.