【Python】merge:数据规整化:清理、转换、合并、重塑
生活随笔
收集整理的這篇文章主要介紹了
【Python】merge:数据规整化:清理、转换、合并、重塑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
merge:數據規整化:清理、轉換、合并、重塑
目錄:
文章目錄
- @[toc]
- 一 合并數據集
- 1 數據庫風格的DataFrame合并
- 2 索引上的合并
- 3 軸向連接
- 4 合并重疊數據
- 二 重塑和軸向旋轉
- 1 重塑層次化索引
- 2 將“長格式”轉換為“寬格式”
- 三 數據轉換
- 1 移除重復數據
- 2 利用函數或映射進行數據轉換
- 3 替換值
- 4 重命名軸索引
- 5 離散化和面元劃分
- 6 檢測和過濾異常值
- 7 排列和隨機采樣
- 8 計算指標/啞變量
- 四 字符串操作
- 1 字符串對象方法
- 2 正則表達式
- 3 pandas中矢量化的字符串函數
- 五 END
- @[toc]
- 一 合并數據集
- 1 數據庫風格的DataFrame合并
- 2 索引上的合并
- 3 軸向連接
- 4 合并重疊數據
- 二 重塑和軸向旋轉
- 1 重塑層次化索引
- 2 將“長格式”轉換為“寬格式”
- 三 數據轉換
- 1 移除重復數據
- 2 利用函數或映射進行數據轉換
- 3 替換值
- 4 重命名軸索引
- 5 離散化和面元劃分
- 6 檢測和過濾異常值
- 7 排列和隨機采樣
- 8 計算指標/啞變量
- 四 字符串操作
- 1 字符串對象方法
- 2 正則表達式
- 3 pandas中矢量化的字符串函數
- 五 END
- 數據分析和建模方面的大量編程工作都是用在數據準備上的:加載、清理、轉換以及重塑。pandas和python標準庫提供了一組高級的、靈活的、高效的核心函數和算法。
一 合并數據集
- pandas.merge可根據一個或多個鍵將不同DataFrame中的行連接起來。SQL或其他關系型數據庫對此思維應用比較常見。
- pandas.concat可以沿著一條軸將多個對象堆疊在一起。
- 實例方法combine_first可以將重復數據編接在一起,用一個對象中的值填充另一個對象中的缺失值。
1 數據庫風格的DataFrame合并
- 數據集的合并(merge)或連接(join)運算是通過一個或多個鍵將行鏈接起來的。這些運算是關系型數據的核心。pandas的merge函數是對數據應用這些算法的主要切入點。
- 默認情況下,merge做的是“inner”連接,結果中的鍵是交集。其他方式還有“left”、“right”、“outer”。外連接求取的是鍵的并集,組合了左連接和右連接的效果。
- 多對多的合并操作非常簡單,無需額外的操作。多對多的連接產生 的是行的笛卡爾積,左邊b行,右邊a行,結果中就有a*b行。連接方式只影響出現在結果中的鍵。
- 要根據多個鍵進行合并,傳入一個由列名組成的列表即可。結果中會出現哪些鍵的組合取決于所選的合并方式,也可以這樣理解:多個鍵形成一系列元組,并將其當作單個連接鍵(實際上并不是這么回事)
- 合并運算需要考慮的最后一個問題是對重復列名的處理。雖然可以手動更改,但是merge有一個更實用的suffixes選項,用于指定附加到左右兩個DataFrame對象的重疊列名上的字符串。
- merge函數的參數:
- ① left # 用于合并的左側DataFrame
- ② right # 用于合并的右側DataFrame
- ③ how # “inner”、“outer”、“left”、‘“right”其中之一,默認為“inner”
- ④ on # 用于連接的列名
- ⑤ left_on、tight_on # 左右側DataFrame分別指定鍵
- ⑥ left_index、right_index # 左右側將索引用作連接鍵
- ⑦ sort# 合并后進行排序,默認為True,處理大數據時,最好禁用
- ⑧ suffixes # 字符串元組,用于追加到重疊列名的結尾,默認為“_x”、“_y”
- ⑨ copy # 默認為Flase,可以在某種特殊情況下禁用,默認總是復制。
2 索引上的合并
- 有時候,DataFrame中的連接鍵位于其索引中,這種情況下,可以傳入left_index、right_index = True,或兩個都傳以說明索引應該被用作連接鍵。
- 對于層次化索引的數據,必須以列表的形式指明用作合并鍵的多個列(注意對重復索引值的處理),同時使用合并雙方的索引也沒問題。
DataFrame還有一個join實例方法,可以更為方便地實現按索引合并。還可以用于合并多個帶有相同或相似索引的DataFrame對象,而不管它們有沒有之間有沒有重疊的列。
3 軸向連接
- 另一種數據合并運算也被稱作連接(concatenation)、綁定(binding)或堆疊(stacking)。Numpy有一個用于合并原始Numpy數組的concatenation函數。
- pandas的concat函數提供了一種能夠解決用于連接的軸、對結果對象中的分組,因索引不同造成的交并集結果等問題。
- concat函數的參數:
- ① objs # 參與連接的pandas對象,唯一必要的參數
- ② axis # 指明連接的軸向,默認為0
- ③ join # “inner”、“outer”其中之一,默認為“outer”
- ④ koin_axes # 指明用于其他N-1條軸的索引,不執行交并集運算
- ⑤keys 與連接對象有關的值,用于形成連接軸向上的層次化索引
- ⑥ levels # 指定用作層次化索引各級別上的索引
- ⑦ names # 用于創建分層級別的名稱
- ⑧ verify_integrity # 檢查結果對象新軸上的重復情況。默認允許(Flase)
- ⑨ ignore_index # 不保留連接軸上的索引,產生一組新的索引range
4 合并重疊數據
- 還有一種數據組合問題不能簡單的用合并和連接運算來處理。
- Numpy的where函數,用于表達一種矢量化的if-elif-else
- Series的combine_first方法,實現相同的功能,而且會進行數據對齊
二 重塑和軸向旋轉
- 有許多用于重新排列表格型數據的基礎運算。這些函數也稱作重塑(reshape)或軸向旋轉(pivot)運算。
1 重塑層次化索引
- 層次化索引為DataFrame數據的重排任務提供了一種具有良好一致性的方式。主要功能有二:
- stack:將數據的列“旋轉”為行
- unstack:將數據的行“旋轉”為列
- 使用stack方法可得到一個Series,對于一個層次化的Series,unstack的方式,可以得到一個DataFrame
- 默認情況下,stack和unstack操作的都是最內層,傳入分層級別的編號或名稱即可對其他級別進行unstack操作。
- 如果不是所有級別值都能在分組中找到,則返回缺失值
- stack默認過濾缺失值,運算可逆
- 對DataFrame進行unstack操作時,作為旋轉軸的級別將會成為結果中的最低級別。
2 將“長格式”轉換為“寬格式”
- 時間序列數據通常是以所謂的“長格式”或“堆疊格式”存儲在數據庫和CSV中的,關系型數據庫中的數據尤其如此。
- 一方面保存數據的完整性,
- 另一方面便于查詢支持。
- 但缺點是長格式的數據操作起來不輕松,可以用DataFrame中的pivot方法實現這個轉換。
- 前兩個參數分別用作行和列索引的列名,最后一個參數值則是用于填充DataFrame的數據列的列名。
- 如果有兩個需要重塑的數據列或者忽略最后一個參數,返回的都是層次化的列。
- pivot只是一個快捷方式,用set_index創建層次索引,再用unstack重塑。
三 數據轉換
- 數據不僅需要重排,也需要過濾、清理以及其他的轉換等工作。
1 移除重復數據
- duplicates() 返回一個布爾型的Series,表示各行是否是重復行
- drop_duplicates() 返回一個移除了重復行的DataFrame
- 這兩個方法默認會判斷全部列,也可以指定部分列進行重復項判斷。
- duplicates() 和drop_duplicates() 默認保留第一個出現的值組合,傳入take_last = True則保留最后一個。
2 利用函數或映射進行數據轉換
- Series的map方法可以接受一個函數或含有映射關系的字典對象,map是一宗實現元素級轉換以及其他數據清理工作的便捷方式。
3 替換值
- 利用fillna方法填充缺失數據可以看做值替換的一種特殊情況,雖然map可以修改對象的數據子集,但replace提供了一種跟簡單、更靈活的方式。
- 傳入的參數也可以是字典。
4 重命名軸索引
跟Series一樣,軸標簽也可以通過函數或映射進行轉換,從而得到一個新對象。軸還可以就地被修改,而無需新建一個數據結構。
data.index.map(str.upper)- 如果想要創建數據集的轉換版(而不是修改原始數據),比較實用的方法是rename
5 離散化和面元劃分
- cut函數
- 為了便于分析,連續數據常常被離散化或拆分為“面元”。要實現這個功能,需要pandas的cut函數
- pandas返回的是一個特殊的Categorical對象。可以將其看作一組表示面元名稱的字符串,含有一個表示不同分類名稱的levels數組以及一個為年齡數據進行標號的labels的屬性。
- 跟區間的符號一樣,圓括號表示開端,方括號表示閉端,哪邊是閉端可以通過tight = Flase控制。
- 如果向cut傳入的面元的數量而不是確切的面元邊界,則它會根據最小值和最大值計算一個等長面元,均勻分組。
- qcut函數
- qcut是一個非常類似于cut的函數,它可以根據樣本分位數對數據進行面元劃分,可以設置自定義的分位數(0~1之間,包含端點)
6 檢測和過濾異常值
data[data['a'] >= 2].any(1) data[data['a'] == 2] = 37 排列和隨機采樣
- 利用numpy.random.permutation函數實現對Series和DataFrame的列的排列工作。
8 計算指標/啞變量
- 另一種常用于統計建模或機器學習的轉換方式為:將分類變量轉換為“啞變量”或“指標矩陣”
四 字符串操作
1 字符串對象方法
- Python內置的字符串方法
- count # 返回子串在字符串中的出現次數
- endswith/startswith # 如果字符串以某個后綴結尾或某個前綴開頭,返回True
- join # 將字符串用作連接到其他字符串序列的分隔符
- index # 如果在字符串中找到子串,則返回子串第一個字符所在的位置
- find # 如果在字符串中找到子串,則返回第一個發現的子串第一個字符所在的位置
- rfind # 如果在字符串中找到子串,則返回第一個發現的子串最后一個字符所在的位置
- replace # 用另一個字符串替換指定字符串
- strip、strip、lstrip # 去除空白符(包括換行符)
- split # 通過指定的分隔符將字符串拆分為一組子串
- lower、upper # 分別將字母字符轉換為大小寫
- ljust、rjust # 用空格填充字符串的空白側 以返回符合最低寬度的字符串
2 正則表達式
3 pandas中矢量化的字符串函數
五 END
總結
以上是生活随笔為你收集整理的【Python】merge:数据规整化:清理、转换、合并、重塑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】GroupBy:数据聚合
- 下一篇: 【Python】ime series:时