连接
1、外连接又叫全连接
2、关系型连接中,pandas可以使用merge和join,通过how来代表连接形式,分为左连接 left 、右连接 right 、内连接 inner 、外连接 outer。
3、如果出现重复的键应该如何处理?只需把握一个原则,即只要两边同时出现的值,就以笛卡尔积的方式加入,如果单边出现则根据连接形式进行处理。
4、merge用法(值连接)
连接相同列:
on也可以连接多个键值,此时用列表括起来:
连接不同名字的两列,使用left_on和right_on:
如果两个表中的列出现了重复的列名,那么可以通过 suffixes 参数指定
即把第一个表和第二个表中除了连接键之外,相同名字的列后面加不同后缀以示区别
5、join(索引连接)
pandas中利用Join函数来处理索引连接,就是把索引当成键进行连接,可以对重复的列指定左右后缀 lsuffix 和 rsuffix ,这样每当有重复的列就会加上你设置的后缀,以示区分。 on 参数指索引名,单层索引时省略参数表示按照当前索引连接。
例如下面,name是单索引,所以join中不需要用On来指定所要连接了索引了,默认为name。
6、concat(方向连接)
有时候用户并不关心以哪一列为键来合并,只是希望把两个表或者多个表按照纵向或者横向拼接,为这种需求, pandas 中提供了 concat 函数来实现。
在 concat 中,最常用的有三个参数,它们是 axis, join, keys ,分别表示拼接方向,连接形式,以及在新表中指示来自于哪一张旧表的名字。这里需要特别注意, join 和 keys 与之前提到的 join 函数和键的概念没有任何关系。
在默认状态下的 axis=0 ,表示纵向拼接多个表,常常用于多个样本的拼接;而 axis=1 表示横向拼接多个表,常用于多个字段或特征的拼接。
axis = 0,默认的:
axis = 1:
当确认要使用多表直接的方向合并时,尤其是横向的合并,可以先用 reset_index 方法恢复默认整数索引再进行合并,防止出现由索引的误对齐和重复索引的笛卡尔积带来的错误结果。
keys参数:
keys 参数的使用场景在于多个表合并后,用户仍然想要知道新表中的数据来自于哪个原表,这时可以通过 keys 参数产生多级索引进行标记。
7、序列和表的合并
其实可以简单理解为:在表后插入记录
如果需要插入的记录是多条的,其实相当于两个dataframe连接,这个时候可以用concat,如果是一条记录,那大多数情况是一个Series,这个时候我们才来讨论如何把Series放到表里面。
下面讨论两种情况,一种是添加行,一种是添加列。
想要把一个序列追加到表的行末或者列末,则可以分别使用 append 和 assign 方法
append添加行:
在 append 中,如果原表是默认整数序列的索引,那么可以使用 ignore_index=True 对新序列对应的索引自动标号,否则必须对 Series 指定 name 属性。
想要在df中添加姓名是Wu Wang 年龄是21的一条记录。
assign添加列:
虽然可以利用其添加新的列,但一般通过 df['new_col'] = ... 的形式就可以等价地添加新列的缺点是它会直接在原表上进行改动,而 assign 返回的是一个临时副本
8、类连接操作
除了上述介绍的若干连接函数之外, pandas 中还设计了一些函数能够对两个表进行某些操作,这里把它们统称为类连接操作。
8.1 compare
在 1.1.0 后引入的新函数,它能够比较两个表或者序列的不同处并将其汇总展示
如果想要完整显示表中所有元素的比较情况,可以设置 keep_shape=True
8.2 combine
这个比较少用。需要重点看一下
combine 函数能够让两张表按照一定的规则进行组合,在进行规则比较时会自动进行列索引的对齐。对于传入的函数而言,每一次操作中输入的参数是来自两个表的同名 Series ,依次传入的列是两个表列名的并集,例如下面这个例子会依次传入 A,B,C,D 四组序列,每组为左右表的两个序列。同时,进行 A 列比较的时候, s2 指代的就是一个全空的序列,因为它在被调用的表中并不存在,并且来自第一个表的序列索引会被 reindex 成两个索引的并集。具体的过程可以通过在传入的函数中插入适当的 print 方法查看。
这里给了一个例子:
选出对应索引位置较小的元素。
设置 overtwrite 参数为 False 可以保留 被调用表 中未出现在传入的参数表中的列,而不会设置未缺失值
8.3 combine_first
其功能是在对两张表组合时,若第二张表中的值在第一张表中对应索引位置的值不是缺失状态,那么就使用第一张表的值填充。(first的含义原来是这样哈哈哈)