pandas提供了一个类似于关系数据库的连接(join)操作的方法merage,可以根据一个或多个键将不同DataFrame中的行连接起来,语法如下:
merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'),copy=True,indicator=False)作为一个功能完善、强大的语言,python的pandas库中的merge()支持各种内外连接。
sql中的SELECT*FROMdf1INNERJOINdf2ONdf1.key=df2.key;或SELECT*FROMdf1,df2wheredf1.key=df2.key
pandas中用:
pd.merge(df1,df2,on='key')然后就是各种外连接了:
pd.merge(df1,df2,on='key',how='left')
how变成left/right。全链接outer。
单个列名做为内链接的连接键agecpid_anamecsid_b020lm0lxh10100140ly1xiao40101多列名做为内链接的连接键agecpidnamecs020lm0lxh10不指定on则以两个DataFrame的列名交集做为连接键agecpidnamecs020lm0lxh10使用右边的DataFrame的行索引做为连接键agecpid_xnamecsid_y020lm0lxh10100140ly1xiao40101左外连接agecpid_anamecsid_b020lm0lxh10100140ly1xiao4010124yry2huaNaNNaN370old3beNaNNaN左外连接1csid_xnameagecpid_y010100lxh20lm0140101xiao40ly1250102hua2NaNNaNNaN右外连接agecpid_xnamecsid_y020lm0lxh10100140ly1xiao401012NaNNaNNaNhua250102使用left_on与right_on来指定列名字不同的连接键agecpidnamecsmidmname020lm0lxh100lxh
join方法提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame。
其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left。
示例:
#coding=utf-8frompandasimportSeries,DataFrame,mergedata=DataFrame([{"id":0,"name":'lxh',"age":20,"cp":'lm'},{"id":1,"name":'xiao',"age":40,"cp":'ly'},{"id":2,"name":'hua',"age":4,"cp":'yry'},{"id":3,"name":'be',"age":70,"cp":'old'}],index=['a','b','c','d'])data1=DataFrame([{"sex":0},{"sex":1},{"sex":2}],index=['a','b','e'])print'使用默认的左连接\r\n',data.join(data1)#这里可以看出自动屏蔽了data中没有的index=e那一行的数据print'使用右连接\r\n',data.join(data1,how="right")#这里出自动屏蔽了data1中没有index=c,d的那行数据;等价于data1.join(data)print'使用内连接\r\n',data.join(data1,how='inner')print'使用全外连接\r\n',data.join(data1,how='outer')结果为:
使用默认的左连接agecpidnamesexa20lm0lxh0b40ly1xiao1c4yry2huaNaNd70old3beNaN使用右连接agecpidnamesexa20lm0lxh0b40ly1xiao1eNaNNaNNaNNaN2使用内连接agecpidnamesexa20lm0lxh0b40ly1xiao1使用全外连接agecpidnamesexa20lm0lxh0b40ly1xiao1c4yry2huaNaNd70old3beNaNeNaNNaNNaNNaN2
还有一种连接方式:concat
concat方法相当于数据库中的全连接(UNIONALL),可以指定按某个轴进行连接,也可以指定连接的方式join(outer,inner只有这两种)。
与数据库不同的是concat不会去重,要达到去重的效果可以使用drop_duplicates方法
concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,copy=True):
#coding=utf-8frompandasimportSeries,DataFrame,concatdf1=DataFrame({'city':['Chicago','SanFrancisco','NewYorkCity'],'rank':range(1,4)})df2=DataFrame({'city':['Chicago','Boston','LosAngeles'],'rank':[1,4,5]})print'按轴进行内连接\r\n',concat([df1,df2],join="inner",axis=1)print'进行外连接并指定keys(行索引)\r\n',concat([df1,df2],keys=['a','b'])#这里有重复的数据print'去重后\r\n',concat([df1,df2],ignore_index=True).drop_duplicates()
输出结果为:
按轴进行内连接cityrankcityrank0Chicago1Chicago11SanFrancisco2Boston42NewYorkCity3LosAngeles5进行外连接并指定keys(行索引)cityranka0Chicago11SanFrancisco22NewYorkCity3b0Chicago11Boston42LosAngeles5去重后cityrank0Chicago11SanFrancisco22NewYorkCity34Boston45LosAngeles5