pandas基础操作大全之数据合并
在pandas 基礎操作大全之數據讀取&清洗&分析中介紹了pandas常見的數據處理操作,現在繼續對pandas常用的數據合并操作做下介紹,便于大家快速了解,也方便后續需要時快速查詢。
一、 concat--數據合并
1.1?概述
#pandas 的 concat函數表達式如下 pd.concat([df1, df2, df3], #指定需合并的兩個或多個Dataframe,各個df的shape可以不同axis = 0, #指定合并時,合并的軸方向,默認為0,即行合并,多個df會在縱向進行拼接合并join = 'outer', #指定在合并軸方向的另外一個軸方向,標簽如何合并,outer指取并集,inner指取交集ignore_index = False, #指定是否保留原各個df在合并軸方向上的原有標簽,默認False,即保留keys = ['a','b','c'], #為合并后的數據,在合并軸方向上指定新的index,便于區分各個合并數據源names = ['groupA','groupB'], #為verify_integrity = False, #指定是否允許在指定的合并軸方向上,允許存在重復的標簽,默認值為False,即允許,當指定為True時,如果有重復,在合并的時候會報錯 )1.2 指定合并的軸方向--axis
#一般情況下,基本是在行方向將多個DataFrame進行連接合并,組成一個新的DataFrame,便于統一進行處理 #常見的應用場景,比如多個DataFrame可能有部分相同的列,希望連在一起,分析其規律 #df1數據源如下:A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2數據源如下:A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1 , df2], axis=0) #運算結果如下A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaNpd.concat([df1 , df2], axis=1) #運算結果如下A B C A B 0 -0.663727 1.883112 -0.409361 0.380397 -1.088665 1 0.874930 -0.120000 0.015474 -1.623468 0.6108551.3 指定合并軸另外一個軸標簽是否合并--join
#一般直接使用join的默認值,即outer,取并集,此時不會丟棄多個DataFrame的任何列信息 #當然,如果想合并時,最后只留下多個DataFrame相同的列或行標簽,則使用inner取交集 #df1數據源如下:A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2數據源如下:A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1 , df2], join = 'outer') #運算結果如下A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaNpd.concat([df1 , df2], join = 'inner') #運算結果如下A B 0 -0.663727 1.883112 1 0.874930 -0.120000 0 0.380397 -1.088665 1 -1.623468 0.6108551.4 指定合并軸原標簽是否需要變化--ignore_index
#該參數在希望對行進行遍歷處理時,會比較有用,因為可以設置忽略合并軸方向之前的index或標簽,重新進行生成,就像是一個全新的DataFrame一樣 #df2數據源如下:A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2數據源如下:A B 0 0.397919 -0.350948 1 0.147547 -0.172974pd.concat([df1,df2],ignore_index=True) #運算結果如下A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 2 0.380397 -1.088665 NaN 3 -1.623468 0.610855 NaNpd.concat([df1,df2],ignore_index=False) #運算結果如下A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaN1.5 指定合并軸方向新的index,便于區分數據--keys
該參數類似于分組的效果
#該參數類似分組的效果,即沿著合并軸方向,按照合并的數據源,進行分組,便于區分合并數據來源 #df1數據源如下:A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2數據源如下:A B 0 0.397919 -0.350948 1 0.147547 -0.172974pd.concat([df1,df2],keys=['a','b']) #運算結果如下A B C a 0 -0.663727 1.883112 -0.4093611 0.874930 -0.120000 0.015474 b 0 0.380397 -1.088665 NaN1 -1.623468 0.610855 NaN1.6 指定合并軸方向新的index 的含義名稱,一般和keys一起使用,讓合并后的數據更直觀--names
#該參數一般與keys一起使用,比如df1和df2是兩個季度前兩個月的數據,然后使用concat,將兩個季度的合并成一個DataFrame,并且用keys指定每個季度的名稱,再用names指定對應的含義 #df1數據源如下:A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2數據源如下:A B 0 0.397919 -0.350948 1 0.147547 -0.172974pd.concat([df1,df2],keys=['第一季度','第二季度'],names = ['季度', '月份']) #運行結果如下A B C 季度 月份 第一季度 0 -0.663727 1.883112 -0.4093611 0.874930 -0.120000 0.015474 第二季度 0 0.380397 -1.088665 NaN1 -1.623468 0.610855 NaN1.7?指定合并時是否允許合并軸上有重復標簽--verify_integrity
#該參數只有在需要合并的數據,嚴格使用index或者列標簽來區分數據的唯一性時,設置為True,才有意義 #否則,一般不設置就行,即默認False,此時合并時不會嚴格要求合并時index或列標簽必須不同 #df1數據源如下:A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2數據源如下:A B 0 0.397919 -0.350948 1 0.147547 -0.172974pd.concat([df1,df2],verify_integrity=True,axis=1) #報錯,因df1和df2均有A、B列標簽 pd.concat([df1,df2],verify_integrity=True,axis=0) #報錯,因為df1和df2均有0、1的index二、 merge--數據連接
merge類似SQL中的連表操作,即通過兩個DataFrame共有的列,作為key,將表在橫向連接起來,主要用于拓展數據信息,比如多個DataFrame,均只記錄了自己關心的完整數據的一部分,希望通過某一共同列,連表,最終形成較為完成的數據信息,是一種非常有用的連接方式
2.1 概述
#merge函數基本表達式如下 pd.merge(df1,df2, #指定需要連接的兩個DataFrameon='A', #指定連接時,以哪個列標簽為準,進行連接,一般指定的列標簽需要在兩個df中均存在how='outer', #指定數據如何連接,有outer、inner、right、left四種取值left_on='A', #如果連接的兩個df沒有相同的列標簽,可以分別指定不同的標簽,用指定的兩個標簽來進行連接,此時需要left_on和right_on 均進行指定right_on='B',left_index=True, #可設置以行index的值連接兩個DataFrame,一般比較少用right_index=True,suffixes=('_df1','_df2') #設置如果兩個DataFrame有除了指定的on列,還有其他相同列標簽時,為進行區分,在各自列后面添加后綴,默認是=('_x','_y') )2.2 指定鍵值列進行連表--on參數
#left_on及right_on用法 #一般用在可能希望作為連接key的列標簽一樣時 #df1數據源為姓名 年齡 0 張三 28 1 李四 31 #df2數據源為姓名 性別 職業 0 張三 男 IT 1 李四 女 運營pd.merge(df1 ,df2, on='姓名') #運算結果如下姓名 年齡 性別 職業 0 張三 28 男 IT 1 李四 31 女 運營 #以上等同于pd.merge(df1,df2),或者df1.merge(df2)#left_on及right_on用法 #一般用在可能希望作為連接key的列標簽不一樣時,使用 #df1數據源為姓名 性別 職業 0 張三 男 IT 1 李四 女 運營 #df2數據源為員工姓名 婚姻狀況 學歷 0 張三 未婚 本科 1 李四 已婚 研究生 pd.merge(df1, df2, left_on='姓名', right_on='員工姓名') #運算結果如下姓名 性別 職業 員工姓名 婚姻狀況 學歷 0 張三 男 IT 張三 未婚 本科 1 李四 女 運營 李四 已 婚 研究生2.3 指定數據連接方式--how參數
#how參數決定了將如何用on指定的key對兩個DataFrame進行連接,主要是比對on指定的兩個df的列標簽, #如果取并集,則是outer,即連接后的Df會包含兩個df所有的key值;如果取交集,則是inner,即連接后的df只會包含兩個df均有的key值 #如果需要保證左邊df的key值必須有,右邊的不一定,則是left;如果需要保證右邊df的key值必須有,左邊的不一定,則是right #df1數據源如下姓名 性別 職業 0 張三 男 IT 1 李四 女 運營 #df2數據源如下姓名 婚姻狀況 學歷 0 張三 未婚 本科 1 李四 已婚 研究生 2 王五 未婚 博士 3 麻子 已婚 研究生 pd.merge(df1 , df2, how='outer') #運算結果如下姓名 性別 職業 婚姻狀況 學歷 0 張三 男 IT 未婚 本科 1 李四 女 運營 已婚 研究生 2 王五 NaN NaN 未婚 博士 3 麻子 NaN NaN 已婚 研究生pd.merge(df1, df2, how='inner') #運算結果如下姓名 性別 職業 婚姻狀況 學歷 0 張三 男 IT 未婚 本科 1 李四 女 運營 已婚 研究生 pd.merge(df1, df2, how='left') #運算結果如下姓名 性別 職業 婚姻狀況 學歷 0 張三 男 IT 未婚 本科 1 李四 女 運營 已婚 研究生 pd.merge(df1, df2, how='right') #運算結果如下姓名 性別 職業 婚姻狀況 學歷 0 張三 男 IT 未婚 本科 1 李四 女 運營 已婚 研究生 2 王五 NaN NaN 未婚 博士 3 麻子 NaN NaN 已婚 研究生2.4 設置使用行索引作為連接key--left_index及right_index參數
#merge一般用于key為列標簽時,對兩個df進行鏈接,類似SQL中的連表操作,不過如果需要,也可以使用行的index作為key進行連表 #left_index、right_index,類似于left_on和right_on,這四個可以left和right兩兩結合,比如df1的index其實就是df2的列的key,此時便可以使用left_index=True,right_on='B',或者直接對兩個df用index進行連表 #df1數據源如下姓名 性別 職業 0 張三 男 IT 1 李四 女 運營 #df2數據源如下姓名 婚姻狀況 學歷 0 張三 未婚 本科 1 李四 已婚 研究生 2 王五 未婚 博士 3 麻子 已婚 研究生 pd.merge(df1, df2, left_index=True, right_index=True #運算結果如下姓名_x 性別 職業 姓名_y 婚姻狀況 學歷 0 張三 男 IT 張三 未婚 本科 1 李四 女 運營 李四 已婚 研究生2.5 設置有相同列時自動加后綴--suffixes
#如果連接的兩個df,除了key列,或者on指定的列外,還有相同的列標簽,為了進行區分,pd會自動在相同的列標簽分別添加后綴,默認是x、y,也可通過suffixes顯示指定 #df1數據源姓名 性別 職業 0 張三 男 IT 1 李四 女 運營 #df2數據源姓名 職業 婚姻狀況 學歷 0 張三 IT 未婚 本科 1 李四 運營 已婚 研究生 2 王五 產品 未婚 博士 3 麻子 市場 已婚 研究生 pd.merge(df1, df2, on='姓名',how='outer',suffixes=('_表1','_表2')) #運算結果如下姓名 性別 職業_表1 職業_表2 婚姻狀況 學歷 0 張三 男 IT IT 未婚 本科 1 李四 女 運營 運營 已婚 研究生 2 王五 NaN NaN 產品 未婚 博士 3 麻子 NaN NaN 市場 已婚 研究生三、 join
join整體功能與merge類似,也與SQL中的join語法功能和表現完全一樣,只不過join可以高效的連接多個DataFrame,而merge只能連接兩個,相當于join的快捷方式,join連接時默認使用行index進行連接,但也可以指定類似merge使用列標簽連表。
3.1 概述
#join函數的使用方法如下 DataFrame.join(other, #指定需要連接的其他df,如果是一個,則直接寫df,如果是多個,則可以是多個df組成的列表或元組,如果是多個,則不支持設置on、lsuffix以及sorton=None, #默認以行index連接,也可以指定列標簽,如果需要指定多個列,則可以是列表或元組形式how='left', #連接的方式,枚舉為 left、right、outer、inner,默認是leftlsuffix=' ', #左df重復列的后綴,只對連接2個df有效,連接多個df如果列標簽有重復,則會報錯rsuffix=' ', #右df重復列的后綴,只對連接2個df有效,連接多個df如果列標簽有重復,則會報錯sort=False #排序,按照字典順序對結果在連接鍵上排序。如果為False,連接鍵的順序取決于連接類型(關鍵字) )3.2?行索引連接--無重復列標簽
#默認join以行索引index連接,如果多個df沒有重復的列標簽,則可以直接進行連接,無需設置其他參數 #此時,也可以一次性連接多個df, #df1數據源姓名 性別 0 張三 男 1 李四 女 #df2數據源職業 婚姻狀況 0 IT 未婚 1 運營 已婚 df1.join(df2) #運算結果如下姓名 性別 職業 婚姻狀況 0 張三 男 IT 未婚 1 李四 女 運營 已婚3.3?行索引連接--有重復列標簽
#當有重復列標簽時,必須設置lsuffix和rsuffix參數,否則就會報錯 #df1數據源姓名 性別 0 張三 男 1 李四 女 #df2數據源姓名 職業 婚姻狀況 0 張三 IT 未婚 1 李四 運營 已婚 df1.join(df2, lsuffix='_a', rsuffix='_b') #運算結果如下姓名_a 性別 姓名_b 職業 婚姻狀況 0 張三 男 張三 IT 未婚 1 李四 女 李四 運營 已婚3.4?列標簽鏈接--列標簽不相同,但內容有相同
#類似merge,如果想鏈接的兩個df,可能列標簽沒有相同,但是某列標簽內容有相同,希望用該列作為Key進行連表,則可以分別設置左右on的key #df1數據源姓名 性別 0 張三 男 1 李四 女 #df2數據源員工姓名 職業 婚姻狀況 0 張三 IT 未婚 1 李四 運營 已婚 2 王五 運營 已婚 df1.join(df2.set_index('員工姓名'),on='姓名') #運算結果如下姓名 性別 職業 婚姻狀況 0 張三 男 IT 未婚 1 李四 女 運營 已婚3.5?列標簽鏈接--列標簽有相同,內容有相同
#以列標簽連表,就類似merge默認的用法,如果除了on指定的列標簽,兩個df還有其他相同的列標簽,則lsuffix和rsuffix必須設置,否則會報錯 #df1數據源姓名 性別 0 張三 男 1 李四 女 #df2數據源姓名 職業 婚姻狀況 0 張三 IT 未婚 1 李四 運營 已婚 2 王五 運營 已婚 df1.join(df2.set_index('姓名'),on='姓名') #運算結果如下姓名 性別 職業 婚姻狀況 0 張三 男 IT 未婚 1 李四 女 運營 已婚3.6?列標簽鏈接--列標簽和列內容均不相同
此時,無法使用列標簽連接兩個DataFrame
3.7?join和merge主要異同
四、 append
該方法主要是對存量的DataFrame添加新的行,或者直接將另外一個DataFrame按0軸(按行)合并到現有的DataFrame上,并且要求兩個DataFrame的列數完全相等
該方法在比如需要對多個列數相同的數據進行合并分析時較為有用,不過直接使用pd.concat(df1,df2)也能達到目的,只是append用法可能更為直觀些
import pandas as pd #df1數據源如下A B 0 -0.606787 0.256638 1 -1.333439 -0.335560 #df2數據源如下A B 0 -0.606787 0.256638 1 -1.333439 -0.335560 df1.append(df2) #運算結果如下:A B 0 0.966491 -0.316075 1 -0.298886 1.016128 0 0.592691 0.478276 1 1.117325 1.294424#其實以上方法,效果等同于concat的默認行為 pd.concat(df1,df2)五、 assign
該方法主要是對存量的DataFrame添加新的列,并且要求新增的列,對應的Series長度需與存量數據相同
該方法用的比較少,因為如果想增加新的列,有更快捷的方式,此處只是羅列說明
#df源數據如下A B 0 -0.606787 0.256638 1 -1.333439 -0.335560 df.assign(C=[1,2]) #結果如下:A B C 0 -0.606787 0.256638 1 1 -1.333439 -0.335560 2#以上操作等同于如下操作,并且相對來說更加直觀 df['C']=[1,2]?
總結
以上是生活随笔為你收集整理的pandas基础操作大全之数据合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PIC单片机概述
- 下一篇: ElasticaSearch安装以及配置