pandas 表的合并 merge/join/contact

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dpengwang/article/details/86143307

最近做比赛的特征工程时,经常用到表的合并,对上述三种操作总是不是熟练的使用,弄不清其中的区别与联系。所以花点时间弄清他们。

merge操作

merge通过一个或者多个键将两张表合并在一起,api如下

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指定合并时依据的列名,单列时后跟字符串,多列时后跟字符串列表
  • how 表示连接方式,inner交集,outer并集,leftright表示根据某一边
    当仅有两个参数merge(left,right)时,on默认的是相同列名,how默认为inner
  • suffixes 参数指定当两个表合并后有相同的列名时,在列名上加的前缀,默认为元组('_x','_y')
  • left_on=None,right_on=None,两个表的列名不同却要根据这两个列名下的属性值来合并的时候使用
    eg:
data1 = pd.DataFrame({
    'a': [1, 1, 3, 4],
    'b': [5, 6, 7, 8],

})

data2 = pd.DataFrame({
    'a': [1, 1,  4],
    "b":[5,6,0],
    'c': [9, 10,  12],
    'd': [13, 14,  16]
})

==>

   a  b
0  1  5
1  1  6
2  3  7
3  4  8
   a  b   c   d
0  1  5   9  13
1  1  6  10  14
2  4  0  12  16
print(pd.merge(data1,data2,on=["a","b"],how="outer"))
print(pd.merge(data1,data2))

==>

   a  b     c     d
0  1  5   9.0  13.0
1  1  6  10.0  14.0
2  3  7   NaN   NaN
3  4  8   NaN   NaN
4  4  0  12.0  16.0
   a  b   c   d
0  1  5   9  13
1  1  6  10  14
suffixes:
data1 = pd.DataFrame({
    'a': [1, 1, 3, 4],
    'b': [5, 6, 7, 8],

})

data2 = pd.DataFrame({
    'a': [1, 1,  4],
    "b":[5,6,0],
    'c': [9, 10,  12],
    'd': [13, 14,  16]
})
res = pd.merge(data1,data2,on="a",suffixes=("_left","_right"),how="inner")
print(res)

==>

   a  b_left  b_right   c   d
0  1       5        5   9  13
1  1       5        6  10  14
2  1       6        5   9  13
3  1       6        6  10  14
4  4       8        0  12  16
left_on ,right_on
data1 = pd.DataFrame({
    'a': [1, 2, 3, 4],
    'b': [5, 6, 7, 8],

})

data2 = pd.DataFrame({
    'c': [1, 10,  12],
    'd': [13, 14,  16]
})

res = pd.merge(data1,data2,left_on="a",right_on="c",how="outer")
print(res)

==>

     a    b     c     d
0  1.0  5.0   1.0  13.0
1  2.0  6.0   NaN   NaN
2  3.0  7.0   NaN   NaN
3  4.0  8.0   NaN   NaN
4  NaN  NaN  10.0  14.0
5  NaN  NaN  12.0  16.0

应用场景:
比如分同时对数据进行求多项式特征和求交叉特征,得到的data1和data2,公共部分为id,则可以根据id把这两部分的数据合并起来。


join操作

用来拼接列,拼接的依据为索引。
这说一下,其实pandas中的merge操作更类似于mysql中的join,而pandas中的join和mysql中的join却相差甚。
API如下

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):

上述参数中除了how的默认值为“left”外其他的都和merge相同。
eg:
两个不含公共列的表进行合并,前提按照index进行合并


data1 = pd.DataFrame({
    'a': [1, 1, 3, 4],
    'b': [5, 5, 7, 8],

})

data2 = pd.DataFrame({
    'c': [1, 10, 12,0],
    'd': [13, 14,16,8]
})
res = data1.join(data2)
print(res)

==>

   a  b   c   d
0  1  5   1  13
1  1  5  10  14
2  3  7  12  16
3  4  8   0   8

index不同时

data1 = pd.DataFrame({
    'a': [1, 1, 3, 4],
    'b': [5, 5, 7, 8],

})

data2 = pd.DataFrame({
    'c': [1, 10, 12,0],
    'd': [13, 14,16,8]
})
data1 = data1.drop_duplicates()
res = data1.join(data2)
print(res)

==>

   a  b   c   d
0  1  5   1  13
2  3  7  12  16
3  4  8   0   8

在使用join的时候千万要注意index的变化,注意drop_duplicates()reset_index()等会改变index的操作


contact 操作

contact 是根据轴来合并两张表,可以理解为左右合并和上下合并
API

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

上下拼接时,依据是列名

data1 = pd.DataFrame({
    'a': [1,2],
    'b': [3,4],

})
data2 = pd.DataFrame({
    'a': [5,6],
    'b': [7,8]
})
data =pd.concat([data1,data2],axis=0)
print(data)
   a  b
0  1  3
1  2  4
0  5  7
1  6  8

注意索引

左右拼接 axis=1

左右拼接时,依据是index

data1 = pd.DataFrame({
    'a': [1,2,9],
    'b': [3,4,9],

})
data2 = pd.DataFrame({
    'a': [5,6],
    'b': [7,8]
})
data =pd.concat([data1,data2],axis=1)
print(data)

==>

   a  b    a    b
0  1  3  5.0  7.0
1  2  4  6.0  8.0
2  9  9  NaN  NaN

小结

在使用这三个方法前,我们要明确我们要根据什么key来合并。根据index,建议使用join,根据列名建议使用merge。如何不需要两张表产生融合而只是拼接,可以使用contact.

猜你喜欢

转载自blog.csdn.net/dpengwang/article/details/86143307