zuoshoushizi

pandas对象中的数据可以通过一些内置的方式进行合并:

 pandas.merge 可根据一个或多个键将不同的DataFrame中的行连接起来。

pandas.concat可以沿着一条轴将多个对象堆叠到一起

实例的方法conbine_first 可以将重复的数据编接到一起,用一个对象中的值填充另一个对象的缺失值。

数据库风格的DataFrame合并

In [51]: df1 = DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
In [53]: df2 = DataFrame({'key':['a','b','d'],'data2':range(3)})

In [54]: df1
Out[54]:
   data1 key
0      0   b
1      1   b
2      2   a
3      3   c
4      4   a
5      5   a
6      6   b

In [55]: df2
Out[55]:
   data2 key
0      0   a
1      1   b
2      2   d

In [56]: pd.merge(df1,df2)
Out[56]:
   data1 key  data2
0      0   b      1
1      1   b      1
2      6   b      1
3      2   a      0
4      4   a      0
5      5   a      0

 

默认不显式指明用哪个键进行连接的时候,merge会将重叠列的列名当做键。不过,最好显式的指明:

In [57]: pd.merge(df1,df2,on = 'key')

如果两个列的列名不同,可以分别指定

In [58]: df4 = DataFrame({'key-r':['a','b','d'],'data2':range(3)})

In [59]: df3 = DataFrame({'key-l':['b','b','a','c','a','a','b'],'data1':range(7)})


In [63]: pd.merge(df3,df4,left_on = 'key-l',right_on = 'key-r')
Out[63]:
   data1 key-l  data2 key-r
0      0     b      1     b
1      1     b      1     b
2      6     b      1     b
3      2     a      0     a
4      4     a      0     a
5      5     a      0     a

默认情况下,merge做的是‘inner’连接,merge还有left、right和outer:

In [64]: pd.merge(df1,df2,how='outer')
Out[64]:
   data1 key  data2
0    0.0   b    1.0
1    1.0   b    1.0
2    6.0   b    1.0
3    2.0   a    0.0
4    4.0   a    0.0
5    5.0   a    0.0
6    3.0   c    NaN
7    NaN   d    2.0

如果要根据多个键进行合并,传入一个由列名组成的列表即可。

In [65]: left = DataFrame({'key1':['a','a','b'],'key2':['one','two','one'],'lrow':[1,2,3]})

In [66]: right = DataFrame({'key1':['a','a','b','b'],'key2':['one','one','one','two'],'rrow':[4,5,6,7]})

In [67]: pd.merge(left,right,on = ['key1','key2'])
Out[67]:
  key1 key2  lrow  rrow
0    a  one     1     4
1    a  one     1     5
2    b  one     3     6

 

如果合并的列中存在重复的列,可以指定重复的列的后缀进行区分

In [68]: pd.merge(left,right,on = ['key1'])
Out[68]:
  key1 key2_x  lrow key2_y  rrow
0    a    one     1    one     4
1    a    one     1    one     5
2    a    two     2    one     4
3    a    two     2    one     5
4    b    one     3    one     6
5    b    one     3    two     7
#指定列名
In [71]: pd.merge(left,right,on = ['key1'],suffixes=['_eft','_right'])
Out[71]:
  key1 key2_eft  lrow key2_right  rrow
0    a      one     1        one     4
1    a      one     1        one     5
2    a      two     2        one     4
3    a      two     2        one     5
4    b      one     3        one     6
5    b      one     3        two     7

 索引上的合并

有时候,DataFrame中的连接键位于其索引中,merge可以通过left_index = True 或 right_index =True 来讲索引应用于连接键。

In [73]: left = DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})
In [75]: right = DataFrame({'group_val':[3.5,7]},index=['a','b'])

In [76]: pd.merge(left,right,left_on = 'key',right_index= True)
Out[76]:
  key  value  group_val
0   a      0        3.5
2   a      2        3.5
3   a      3        3.5
1   b      1        7.0
4   b      4        7.0

对于层次化的索引,需要对应的left_on = ['key1','key2'] , right_index = True

 

相关文章:

  • 2022-12-23
  • 2021-12-21
  • 2021-08-06
  • 2021-06-29
  • 2021-11-17
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-02-28
  • 2021-05-10
  • 2022-12-23
  • 2021-10-20
  • 2021-06-06
相关资源
相似解决方案