日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python】merge:数据规整化:清理、转换、合并、重塑

發布時間:2025/3/21 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】merge:数据规整化:清理、转换、合并、重塑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
merge:數據規整化:清理、轉換、合并、重塑

目錄:

文章目錄

    • @[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函數是對數據應用這些算法的主要切入點。
pd.merge(df1,df2,on = 'key') pd.merge(df1,df2) #如果沒有指定,merge會將重疊列的列名當做鍵,最好顯示指定一下。 pd.merge(df1,df2,left_on = 'key1',right_on = 'key2' # 如果兩個對象的列名不同,可以分別進行指定
  • 默認情況下,merge做的是“inner”連接,結果中的鍵是交集。其他方式還有“left”、“right”、“outer”。外連接求取的是鍵的并集,組合了左連接和右連接的效果。
  • 多對多的合并操作非常簡單,無需額外的操作。多對多的連接產生 的是行的笛卡爾積,左邊b行,右邊a行,結果中就有a*b行。連接方式只影響出現在結果中的鍵。
  • 要根據多個鍵進行合并,傳入一個由列名組成的列表即可。結果中會出現哪些鍵的組合取決于所選的合并方式,也可以這樣理解:多個鍵形成一系列元組,并將其當作單個連接鍵(實際上并不是這么回事)
  • 合并運算需要考慮的最后一個問題是對重復列名的處理。雖然可以手動更改,但是merge有一個更實用的suffixes選項,用于指定附加到左右兩個DataFrame對象的重疊列名上的字符串。
pd.merge(left,right,on = 'key' pd.merge(left,right,on = 'key1',suffixes = ('_left','_right'))
  • 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,或兩個都傳以說明索引應該被用作連接鍵。
  • 對于層次化索引的數據,必須以列表的形式指明用作合并鍵的多個列(注意對重復索引值的處理),同時使用合并雙方的索引也沒問題。
pd.merge(lefth,righth,left_on = ['key1','key2'],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:將數據的行“旋轉”為列
data.stack() data.stack.unstack()
  • 使用stack方法可得到一個Series,對于一個層次化的Series,unstack的方式,可以得到一個DataFrame
  • 默認情況下,stack和unstack操作的都是最內層,傳入分層級別的編號或名稱即可對其他級別進行unstack操作。
  • 如果不是所有級別值都能在分組中找到,則返回缺失值
  • stack默認過濾缺失值,運算可逆
  • 對DataFrame進行unstack操作時,作為旋轉軸的級別將會成為結果中的最低級別。

2 將“長格式”轉換為“寬格式”

  • 時間序列數據通常是以所謂的“長格式”或“堆疊格式”存儲在數據庫和CSV中的,關系型數據庫中的數據尤其如此。
    • 一方面保存數據的完整性,
    • 另一方面便于查詢支持。
  • 但缺點是長格式的數據操作起來不輕松,可以用DataFrame中的pivot方法實現這個轉換。
pivoted = ldata.pivot('date','item','value')
  • 前兩個參數分別用作行和列索引的列名,最后一個參數值則是用于填充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提供了一種跟簡單、更靈活的方式。
data.replace(a,'b') data.replace(['a','c'],'b') data.replace(['a','c'],['b','d'])
  • 傳入的參數也可以是字典。

4 重命名軸索引

跟Series一樣,軸標簽也可以通過函數或映射進行轉換,從而得到一個新對象。軸還可以就地被修改,而無需新建一個數據結構。

data.index.map(str.upper)
  • 如果想要創建數據集的轉換版(而不是修改原始數據),比較實用的方法是rename
data.rename(index = str.title,columns = str.upper) # 可以結合字典對象

5 離散化和面元劃分

  • cut函數
    • 為了便于分析,連續數據常常被離散化或拆分為“面元”。要實現這個功能,需要pandas的cut函數
    • pandas返回的是一個特殊的Categorical對象。可以將其看作一組表示面元名稱的字符串,含有一個表示不同分類名稱的levels數組以及一個為年齡數據進行標號的labels的屬性。
    • 跟區間的符號一樣,圓括號表示開端,方括號表示閉端,哪邊是閉端可以通過tight = Flase控制。
    • 如果向cut傳入的面元的數量而不是確切的面元邊界,則它會根據最小值和最大值計算一個等長面元,均勻分組。
ages = [20,22,25,27,21,23,37,23,23,54,26,29] bins = [18,25,35,60,100] cats = pd.cut(ages,cuts) cats cats.labels cats.levels pd.cut(data,4,precision = 2)
  • qcut函數
    • qcut是一個非常類似于cut的函數,它可以根據樣本分位數對數據進行面元劃分,可以設置自定義的分位數(0~1之間,包含端點)

6 檢測和過濾異常值

data[data['a'] >= 2].any(1) data[data['a'] == 2] = 3

7 排列和隨機采樣

  • 利用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:数据规整化:清理、转换、合并、重塑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。