pandas 表的合并 merge/join/contact 您所在的位置:网站首页 pandas合并两个表格 pandas 表的合并 merge/join/contact

pandas 表的合并 merge/join/contact

2024-06-30 14:27| 来源: 网络整理| 查看: 265

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

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并集,left和right表示根据某一边 当仅有两个参数merge(left,right)时,on默认的是相同列名,how默认为innersuffixes 参数指定当两个表合并后有相同的列名时,在列名上加的前缀,默认为元组('_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.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有