concat 、join 、merge

In [4]: import pandas as pd                                                                                                                                       

In [5]: import numpy as np                                                                                                                                        

In [6]: df1=DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])                                                                                             

In [7]: df2=DataFrame(np.random.randn(2,3),columns=['b','d','a'])                                                                                                 

In [8]: df1                                                                                                                                                       
Out[8]: 
          a         b         c         d
0 -0.278649 -0.909574  0.736608 -0.813353
1  0.644753 -0.469741  0.593455  1.432505
2  1.024692 -1.316237  0.903557  0.170960

In [9]: df2                                                                                                                                                       
Out[9]: 
          b         d         a
0 -0.956196 -2.253606 -0.777591
1 -0.532908  0.428463  0.702811

concat 默认axis=0 join='outer'

concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

In [10]: pd.concat([df1, df2])                                                                                                                                    
Out[10]: 
          a         b         c         d
0 -0.278649 -0.909574  0.736608 -0.813353
1  0.644753 -0.469741  0.593455  1.432505
2  1.024692 -1.316237  0.903557  0.170960
0 -0.777591 -0.956196       NaN -2.253606
1  0.702811 -0.532908       NaN  0.428463
In [11]: pd.concat([df1, df2], axis=1)                                                                                                                            
Out[11]: 
          a         b         c         d         b         d         a
0 -0.278649 -0.909574  0.736608 -0.813353 -0.956196 -2.253606 -0.777591
1  0.644753 -0.469741  0.593455  1.432505 -0.532908  0.428463  0.702811
2  1.024692 -1.316237  0.903557  0.170960       NaN       NaN       NaN
In [12]: pd.concat([df1, df2], join='inner')                                                                                                                      
Out[12]: 
          a         b         d
0 -0.278649 -0.909574 -0.813353
1  0.644753 -0.469741  1.432505
2  1.024692 -1.316237  0.170960
0 -0.777591 -0.956196 -2.253606
1  0.702811 -0.532908  0.428463
In [13]: pd.concat([df1, df2], axis=1, join='inner')                                                                                                              
Out[13]: 
          a         b         c         d         b         d         a
0 -0.278649 -0.909574  0.736608 -0.813353 -0.956196 -2.253606 -0.777591
1  0.644753 -0.469741  0.593455  1.432505 -0.532908  0.428463  0.702811

由此看出,concat就是把两个表堆叠在一起,或横向或纵向。
outer 为直接合并,不去管重复的索引。
inner 根据指定轴(axis),只保留交集的索引。
当axis=0时:pd.concat([df1, df2])df1.append(df2) 返回的结果是一样的。
当axis=1时:pd.concat([df1, df2], axis=1)pd.merge(df1, df2, left_index=True, right_index=True, how='outer')的返回结果一样。

merge:通过键拼接列

类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。
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)

left和right:两个不同的DataFrame;
how:连接方式,有inner、left、right、outer,默认为inner;
on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
left_on:左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;
right_on:右侧DataFrame中用于连接键的列名;
left_index:使用左侧DataFrame中的行索引作为连接键;
right_index:使用右侧DataFrame中的行索引作为连接键;
sort:默认为True,将合并的数据进行排序,设置为False可以提高性能;
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y');
copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能;
indicator:显示合并数据中数据的来源情况
In [27]: df1=DataFrame({'key':['a','b','b'],'data1':range(3)})                                                                                                    

In [28]: df2=DataFrame({'key':['a','b','c'],'data2':range(3)})                                                                                                    

In [29]: df1                                                                                                                                                      
Out[29]: 
  key  data1
0   a      0
1   b      1
2   b      2

In [30]: df2                                                                                                                                                      
Out[30]: 
  key  data2
0   a      0
1   b      1
2   c      2
In [31]: pd.merge(df1, df2)                                                                                                                                       
Out[31]: 
  key  data1  data2
0   a      0      0
1   b      1      1
2   b      2      1

In [32]: pd.merge(df2,df1)                                                                                                                                        
Out[32]: 
  key  data2  data1
0   a      0      0
1   b      1      1
2   b      1      2

默认取 key 的交集

In [33]: pd.merge(df2,df1,how='left')                                                                                                                             
Out[33]: 
  key  data2  data1
0   a      0    0.0
1   b      1    1.0
2   b      1    2.0
3   c      2    NaN

指定做连接,以左边的 key 为主

join:主要用于索引上的合并

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False)
提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame.
join方法默认为左外连接 how=left

In [38]: df1=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'])                                                                                                                                                                                                                                                          
In [39]: df1                                                                                                                                                      
Out[39]: 
   id  name  age   cp
a   0   lxh   20   lm
b   1  xiao   40   ly
c   2   hua    4  yry
d   3    be   70  old

In [41]: df2=DataFrame([{"sex":0},{"sex":1},{"sex":2}],index=['a','b','e'])
In [43]: df2                                                                                                                                                      
Out[43]: 
   sex
a    0
b    1
e    2
In [44]: df1.join(df2)                                                                                                                                            
Out[44]: 
   id  name  age   cp  sex
a   0   lxh   20   lm  0.0
b   1  xiao   40   ly  1.0
c   2   hua    4  yry  NaN
d   3    be   70  old  NaN

In [46]: df1.join(df2, how='right')                                                                                                                               
Out[46]: 
    id  name   age   cp  sex
a  0.0   lxh  20.0   lm    0
b  1.0  xiao  40.0   ly    1
e  NaN   NaN   NaN  NaN    2

In [47]: df1.join(df2, how='inner')                                                                                                                               
Out[47]: 
   id  name  age  cp  sex
a   0   lxh   20  lm    0
b   1  xiao   40  ly    1

In [48]: df1.join(df2, how='outer')                                                                                                                               
Out[48]: 
    id  name   age   cp  sex
a  0.0   lxh  20.0   lm  0.0
b  1.0  xiao  40.0   ly  1.0
c  2.0   hua   4.0  yry  NaN
d  3.0    be  70.0  old  NaN
e  NaN   NaN   NaN  NaN  2.0

可以看出 join 是对索引的合并

你可能感兴趣的:(concat 、join 、merge)