pandas操作——合併數據集
數據集的合併(merge)或連接(join)運算是通過一個或多個鍵將行鏈接起來。
pandas.merge可根據一個或多個鍵將不同DataFrame中的行連接起來。例如:
下面是多對一合併,df1中的數據有多個被標記為a和b的行,而df2中key列的每個值則對應一行:
如果沒有指定,merge就會將重疊的列名當做鍵,一般顯式指定:
如果兩個對象的列名不同,需要分別進行指定:
上面操作的結果里,lkey中的』c』和rkey中的』d』及其對應的值已經消失,這是因為默認情況下,merge做的是「inner」連接,即結果中的鍵是交集。連接方式是用參數how來指定,包括「left」、「right」以及「outer」。
下面是外連接求取的是鍵的並集:
多對多的合併操作,產生的是行的笛卡爾積:
左右連接中左邊的DataFrame有3個「b」行,右邊的有2個,所以最終結果有6個「b」行。連接方式隻影響出現在結果中的鍵:
鍵的交集:
多個鍵進行合併,傳入一個有列名組成的列表即可:
注意:在進行列-列連接時,DataFrame對象中的索引會丟棄。
對重複列名的處理,使用suffixes選項,用於指定附加到左右兩個DataFrame對象的重疊列名上的字元串:
merge函數的參數:
源碼:
# coding: utf-8nn# In[1]:nnimport numpy as npnfrom pandas import Series,DataFramenimport pandas as pdnnn# In[2]:nndf1 = DataFrame({key:[c,d,a,b,c],data1:range(5)})nprint(df1)nnn# In[3]:nndf2 = DataFrame({key:[a,b,c],data2:range(3)})nprint(df2)nnn# In[4]:nn# 多對一合併npd.merge(df1,df2)nnn# In[5]:nn# 顯式指定列名當做鍵npd.merge(df1,df2,on=key)nnn# In[6]:nn# 如果兩個對象的列名不同,需要分別指定ndf3 = DataFrame({lkey:[b,b,a,c,a,a,b],data1:range(7)})ndf4 = DataFrame({rkey:[a,b,d],data2:range(3)})npd.merge(df3,df4,left_on=lkey,right_on=rkey) nnn# In[7]:nn# 外連接求取鍵的並集npd.merge(df1,df2,how=outer)nnn# In[8]:nn# 多對多的合併ndf1 = DataFrame({key:[b,b,a,c,a,b],data1:range(6)})nprint(df1)nnn# In[9]:nndf2 = DataFrame({key:[a,b,a,b,d],data2:range(5)})nprint(df2)nnn# In[10]:nn# 左連接npd.merge(df1,df2,on=key,how=left)nnn# In[12]:nn# 右連接npd.merge(df1,df2,on=key,how=right)nnn# In[13]:nn# 鍵的交集npd.merge(df1,df2,how=inner)nnn# In[14]:nn# 多個鍵合併nleft = DataFrame({key1:[foo,foo,bar],n key2:[one,two,one],n lval:[1,2,3]})nright = DataFrame({key1:[foo,foo,bar,bar],n key2:[one,one,one,two],n rval:[4,5,6,7]})npd.merge(left,right,on=[key1,key2],how=outer)nnn# In[15]:nn# 使用suffixes選項對重複列名進行處理npd.merge(left,right,on=key1)nnn# In[16]:nnpd.merge(left,right,on=key1,suffixes=(_left,_right))n
推薦閱讀: