pandas连接函数concat、append、merge、join、combine_first

concat函数

参数说明:

参数 说明
objs 接收多个Series、DataFrame、Panel的组合。表示参与连接的pandas对象的列表的组合。无默认
axis 轴向选择,默认为0
join 连接方式,inner(交集)和outer(并集),默认为outer
join_axes 接收Index对象。表示用于其他n-1条轴的索引,不执行并集/交集运算
ignore_index 接收boolean。表示不保留轴上的索引,产生一组新索引range(total_length)。默认为False
keys 接收sequence。表示与连接对象有关的值,用于写成连接轴向上的层次化索引。默认为None
levels 接收包含多个sequence的list。表示在指定keys参数后,指定用作层次化索引各级别上的索引。默认为None
names 接收list。表示在设置了keys和levels参数后,用于创建分层级别的名称。默认为None
verify_integrity 接收boolean。检查新连接的轴是否包含重复项。如果发现重复项,则引发异常。默认为False

axis、join

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                'B': ['B0', 'B1', 'B2'],
                'C': ['C0', 'C1', 'C2']},
                index=[0, 1, 2])

 
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
                'B': ['B3', 'B4', 'B5'],
                'C': ['C3', 'C4', 'C5']},
                index=[2,3,4])

 
df3 = pd.DataFrame({'A': ['A6', 'A7', 'A8'],
                'B': ['B6', 'B7', 'B8'],
                'C': ['C6', 'C7', 'C8']},
                index=[4,5,6])
pd.concat([df1,df2,df3],join='outer',axis=0)

这种连接方式会将列名相同的叠加在一起,如果有不同的列名会以NaN补充其他对象在该列的位置,如果join的参数是inner的话,那么合并后的表只会出现大家都有的AB两列,就是交集。

在这里插入图片描述

如果是axis=1也就是行连接的话,其实也差不多,只是连接的方向改变了,原理相同,根据行索引来合并,并集取全部,有些对象有的行,其他对象没有的行会填充NaN,交集的话只会去所有对象都有的行来合并。

pd.concat([df1,df2,df3],join='outer',axis=1)

在这里插入图片描述

keys

可以连接的对象指定一个键值,这样连接完后我们可以看到每一部分的数据属于哪个对象

pd.concat([df1,df2,df3],join='outer',axis=1,keys=['a','b','c'])

在这里插入图片描述
如果keys的值多与连接的对象,那么只会去前面部分的几个值,如果少了,那么确实几个key值,就有几个对象不进行连接
演示一下:
这里值给定了keys两个参数,而连接的是三个对象,最终结果只有前面两个对象进行连接。

pd.concat([df1,df2,df3],join='outer'![在这里插入图片描述](https://img-blog.csdnimg.cn/20190918094527459.png),axis=1,keys=['a','b'])

在这里插入图片描述
keys还有另外一种用法,就是使用字典来指定,结果是相同的,下面的例子采用的是列连接

pd.concat({'a':df1,'b':df2,'c':df3},join='outer')

在这里插入图片描述

ignore_index

这个参数其实很简单,它的意义就是,如果你觉得数据表格的行索引没什么用,是可以忽略的,那么你可以通过设置这个参数为True,得到的结果会自动将行索引变成最简单的序列。
拿上面的例子来看:
在这里插入图片描述
这里它的行索引是从原来的对象带来的,如果这些索引没什么用,我们可以使用ignore_index参数忽略它

pd.concat([df1,df2,df3],join='outer',ignore_index=True)

在这里插入图片描述

append

参数列表:

参数 说明
other 接收DataFrame、series、dict、list这样的数据结构
ignore_index 默认值为False,如果为True则不使用用来的index标签
verify_integrity 默认值为False,如果为True且ignore_index为False时,当创建相同的index时会抛出ValueError的异常

append方法可以将两个列名相同的表纵向叠加起来,也可以给表添加新的列,功能相当于axis=0,join=outer的concat函数连接两个表,但是append可以添加Series、dict、list成为表的新列

添加series(注意,必须要指定series的name,否则会报错)

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                'B': ['B0', 'B1', 'B2'],
                'D': ['C0', 'C1', 'C2']},
                index=[0, 1, 2])、
                
s1 = pd.Series({'A':22,'B':33,'C':44,'D':55},name='a')
df1.append(s1,ignore_index=True)

在这里插入图片描述

添加list
如果列表是一维的,那么会以列的形式添加,如果是二维的,那么会以行的形式添加,如果是三维的,那么会以单个元素的形式添加

一维list

l1 = [1,2,3,4]
df1.append(l1,ignore_index=True)

在这里插入图片描述
二维list

l1 = [[1,2,3,4]]
df1.append(l1,ignore_index=True)

在这里插入图片描述
三维list

l1 = [[[1,2,3,4]]]
df1.append(l1,ignore_index=True)

在这里插入图片描述
添加字典

d1 = {'A':22,'B':33,'E':44}
df1.append(d1,ignore_index=True)

在这里插入图片描述

merge

参数说明:

参数 说明
left 接收DataFrame或Series。表示要添加的数据1.无默认
right 接收DataFrame或Series。表示要添加的数据2.无默认
how 接收left、right、inner、right。表示数据的连接方式,默认为inner
on 接收string或sequence。表示两个数据合并的主键(必须一致)。默认为None
left_on 接收string或sequence。表示left参数接收数据用于合并的主键。默认为None
right_on 接收string或sequence。表示right参数接收数据用于合并的主键。默认为None
left_index 接收boolean。表示是否将left参数接收数据的index作为连接主键。默认为False
right_index 接收boolean。表示是否将right参数接收数据的index作为连接主键。默认为False
sort 接收boolean。表示是否根据连接键对合并后的数据进行排序。默认为False
suffixes 接收tuple。表示用于追加到left和right参数接收数据列名相同时的后缀。默认为(’_x’,’_y’)

merge方法与数据库的连表查询很相似,接收两个表的数据,通过各种不同的参数设置查询不同的结果。

实验数据:

df1 = pd.DataFrame({'A': ['a', 'b', 'c'],
                'B1': [0,1,2],
                'C1': ['C0', 'C1', 'C2']},
                index=[0, 1, 2])

 
df2 = pd.DataFrame({'A': ['a', 'b', 'd'],
                'B2': ['B3', 'B4', 'B5'],
                'C2': ['C3', 'C4', 'C5']},
                index=[2,3,4])

不同的连接方式

在这里插入图片描述

how参数表示两个表的连接方式,
left(左连接),取左表的全部数据,如果没有指定连接键,右表根据和左表相同的字段来匹配进行。否则根据连接键来匹配

pd.merge(left=df1,right=df2,how='left')

在这里插入图片描述
right(右连接),与左连接一样,主表不同
inner(交集),在这种连接模式下,两表只会取在主键中,大家都有的值进行组合

pd.merge(left=df1,right=df2,how='inner',on='A')  

在这里插入图片描述
outer(并集),取两表连接键的索引值,没有该值的表的将以NaN填充

pd.merge(left=df1,right=df2,how='outer',on='A')

在这里插入图片描述

连接关键字

在默认的情况下会自动将两表相同的字段作为连接关键字,但是如果没有相同的字段或者相同的字段多余一个,那么继续连接会报错,所以我们一般使用的时候都要指定连接关键字。

第一种就是使用on关键字,这个方法只有两表关键字相同的情况下可以使用,
如果我们要通过两个表两个不同的字段名进行连接,那么可以使用left_on和right_on参数来分别指定两个表的关键字是什么,然后就会根据这两个字段的值进行匹配

df1 = pd.DataFrame({'A': ['a', 'b', 'c'],
                'B1': [0,1,2],
                'C1': ['C0', 'C1', 'C2']},
                index=[0, 1, 2])

 
df2 = pd.DataFrame({'A': ['a', 'b', 'd'],
                'B2': [0,1,2],
                'C2': ['C3', 'C4', 'C5']},
                index=[2,3,4])

pd.merge(left=df1,right=df2,left_on='B1',right_on='B2')

在这里插入图片描述
我们不仅仅可以使用字段来进行匹配,还可以使用索引作为关键字

df1

在这里插入图片描述

df2

在这里插入图片描述

pd.merge(left=df1,right=df2,left_on='B1',right_index=True)

在这里插入图片描述
上面这个例子用df2的索引值作为关键字,df1的B1列的值作为关键字进行匹配,可以看到只有2是两者都有的,所以最后结果只有一行。

当两个表有相同的字段名,而又不是作为主键,那么他们合并后会出现_x,_y的默认后缀,suffixes参数可以自定义这个后缀

pd.merge(left=df1,right=df2,left_on='B1',right_index=True,suffixes=['-a','-b'])

在这里插入图片描述

join

join的用法与merge有相似之处,这里只提一下

df1.join(df2,rsuffix='a',on='B1',how='outer')

相当于

pd.merge(df1,df2,left_on='B1',right_index=True,how='outer')

on–>接收左表df1的连接键(根据“key”进行左连接),默认是以index为主键,右表df2以index为主键,
rsuffix与lsuffix相当于merge中的suffixes,指定左右表字段重复时的后缀。没有默认值,一般需要自己手动指定。

combine_first

df5=pd.DataFrame({
    0:[1,2,np.nan],
    1:[4,np.nan,6]
})
df6=pd.DataFrame({
    0:[1,2,33],
    1:[4,55,np.nan]
})

df5.combine_first(df6)

在这里插入图片描述

当左表存在空值时,右表对应位置的值会替换左表的空值,但是必须是字段名和索引值相同的位置,如果两个表不是结构相同的,那么就会默认采用全连接(并集)的方式联结两表

发布了38 篇原创文章 · 获赞 3 · 访问量 3139

猜你喜欢

转载自blog.csdn.net/weixin_44941795/article/details/100971446