數據規整化:清理、轉換、合併、重塑

筆記來源:利用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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章