将两张表通过连接、拼接等操作合并成一张表的操作是对表格数据最常用的操作。
关系型连接
把两张相关的表按照某一个或某一组键连接起来是一种常见操作,例如学生期末考试各个科目的成绩表按照姓名和班级连接成总的成绩表。在 Pandas 中的关系型连接函数有 merge() 和 join(),它们最重要的参数有两个,一个是 “on” 参数,用来指定连接的键;另一个是 “how” 参数,用来指定连接形式,分为左连接 left 、右连接 right 、内连接 inner 、外连接 outer,所谓左连接即以左边的键为准,如果右边表中的键于左边存在,那么就添加到左边,否则处理为缺失值,右连接的处理类似。内连接只负责合并两边同时出现的键,而外连接则会在内连接的基础上包含只在左边出现以及只在右边出现的值,因此外连接又叫全连接。
1 | import pandas as pd |
对于一张表中出现重复的键,只需把握一个原则,即只要两边同时出现的值,就以笛卡尔积的方式加入。
方向性拼接
方向拼接为我们提供将两个或多个表按照纵向或横向的方向进行直接拼接的操作,对应的函数是concat(),其最常用三个参数是 axis(拼接方向), join(连接方式), keys(在新表中指示来自于哪一张旧表的名字)。
1 | # 纵向拼接各表中人的信息 |
在默认状态下的 axis=0 ,表示纵向拼接多个表,常常用于多个样本的拼接;而 axis=1 表示横向拼接多个表,常用于多个字段或特征的拼接。纵向拼接会根据列索引对齐,默认状态下 join=outer ,表示保留所有的列,并将不存在的值设为缺失;join=inner 表示保留两个表都出现过的列。横向拼接则根据行索引对齐。
表追加序列
利用 concat 可以实现多个表之间的方向拼接,如果想要把一个序列追加到表的行末或者列末,则可以分别使用 append() 和 assign() 方法。
1 | s = pd.Series(['Wu Wang', 21], index = df1.columns) |
在 append 中,如果原表是默认整数序列的索引,那么可以使用 ignore_index=True 对新序列对应索引的自动标号,否则必须对 Series 指定 name 属性。使用 [] 添加新的列会直接在原表上进行改动,而 assign 返回的是一个临时副本。
类连接操作
我们可以把 Pandas 中对两个表同时进行某些操作的函数也看做是类连接的操作,这里重点介绍 compare() 比较函数和 combine() 组合函数。
1 | # 比较两个表或者序列的不同处并将其汇总展示 |
compare 函数展示的结果中返回了不同值所在的行列,如果相同则会被填充为缺失值 NaN ,其中 other 和 self 分别指代传入的参数表和被调用的表自身,如果想要完整显示表中所有元素的比较情况,可以设置 keep_shape=True。combine 函数能够让两张表按照一定的规则进行组合,在进行规则比较时会自动进行列索引的对齐。对于传入的函数而言,每一次操作中输入的参数是来自两个表的同名 Series ,依次传入的列是两个表列名的并集。