在數(shù)據(jù)挖掘過程中,經(jīng)常會有不同表格的數(shù)據(jù)需要進行合并操作。今天介紹通過python下的pandas庫下的merge方法和concat方法來實現(xiàn)數(shù)據(jù)集的合并。
1.merge
merge 函數(shù)通過一個或多個鍵來將數(shù)據(jù)集的行連接起來。該函數(shù)的主要 應用場景是針對同一個主鍵存在兩張包含不同特征的表,通過該主鍵的連接,將兩張表進行合并。合并之后,兩張表的行數(shù)沒有增加,列數(shù)是兩張表的列數(shù)之和減一。
函數(shù)的具體參數(shù)為:
merge(left,right,how='inner',on=None,left_on=None,right_on=None,
left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True)
- on=None 指定連接的列名,若兩列希望連接的列名不一樣,可以通過left_on和right_on 來具體指定
- how=’inner’,參數(shù)指的是左右兩個表主鍵那一列中存在不重合的行時,取結(jié)果的方式:inner表示交集,outer 表示并集,left 和right 表示取某一邊。
舉例如下
import pandas as pd
df1 = pd.DataFrame([[1,2,3],[5,6,7],[3,9,0],[8,0,3]],columns=['x1','x2','x3'])
df2 = pd.DataFrame([[1,2],[4,6],[3,9]],columns=['x1','x4'])
print df1
print df2
df3 = pd.merge(df1,df2,how = 'left',on='x1')
print df3
在這里我分別設置了兩個DataFrame類別的變量df1,df2,(平常我們用的表csv文件,讀取之后也是DataFrame 格式)。然后我設置 on=’x1’,即以兩個表中的x1為主鍵進行連接,設置how=’left’ ,即是以兩個表中merge函數(shù)中左邊那個表的行為準,保持左邊表行數(shù)不變,拿右邊的表與之合并。結(jié)果如下:
第一個結(jié)果為how=’left’的情況。第二個結(jié)果為how=’inner’的情況。
注意:在how=’left’設置后,左邊行之所以能夠保持不變,是因為右邊的表主鍵列沒有重復的值,x下面我會舉個例子作為思考題:
這是兩張表,分別為df1,df2;
第一個問題:
在默認情況下即merge(df1,df2)其他參數(shù)為默認值的返回結(jié)果是 什么?
第二個問題:
在加上how=’left’之后的返回結(jié)果是什么?
看完了問題之后,返回去看這兩張表,不著急看答案,仔細想想。
這兩個問題明白之后,表之間的連接和映射應該都能夠明白了。
2.concat
concat 與其說是連接,更準確的說是拼接。就是把兩個表直接合在一起。于是有一個突出的問題,是橫向拼接還是縱向拼接,所以concat 函數(shù)的關(guān)鍵參數(shù)是axis 。
函數(shù)的具體參數(shù)是:
concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False)
- objs 是需要拼接的對象集合,一般為列表或者字典
- axis=0 是行拼接,拼接之后行數(shù)增加,列數(shù)也根據(jù)join來定,join=’outer’時,列數(shù)是兩表并集。同理join=’inner’,列數(shù)是兩表交集。
在默認情況下,axis=0為縱向拼接,此時有
concat([df1,df2]) 等價于 df1.append(df2)
在axis=1 時為橫向拼接 ,此時有
concat([df1,df2],axis=1) 等價于 merge(df1,df2,left_index=True,right_index=True,how='outer')
舉個例子
import pandas as pd
df1 = pd.DataFrame({'key':['a','a','b','b'],'data1':range(4)})
print df1
df2 = pd.DataFrame({'key':['b','b','c','c'],'data2':range(4)})
print df2
print pd.concat([df1,df2],axis=1)
print pd.merge(df1,df2,left_index=True,right_index=True,how='outer')
參考文獻:
pandas 數(shù)據(jù)規(guī)整
|