类似于数据库,merge操作就是将两张表合并成一张表。这里需要一些数据库的知识,知道什么叫做主键、什么叫外键、什么叫一对一、一对多、多对一、多对多的数据库关系,以及合并之后的取值方式:inner/outer/left/right。
简单的说,主键就是可以用来唯一区分记录的id值,一般用一个与业务无关的序列来表示。比如电脑的mac地址。
外键则是这个数据表和其他数据表用来做关联的字段名。我们可以用on来指定,如果在不同的表中名字不一样但是表达的内容是一样的,我们可以通过left_on和right_on参数来指定两张表中的外键。
如果我们通过外键关联后,出现了一张表中的某些字段为Na,那默认情况下,会使用inner的方式,也就是取交集的方式,把包含Na的记录删除掉,只保留那些没有Na的有效数据条目。而如果使用outer的方式的话,则是采用并集,把左右两个数据库中所有条目都合并进来,现实所有的条目,而left和right则分别代表以左边或者右边的数据库中的条目为准,也就是left的话只显示合并后左边表格原有的条目,right只显示右边条目。
我们可以用以下代码来演示:
import pandas as pd
bookid_table = pd.DataFrame({
'book_name' : ['a','b','c','d','e','f'],
'book_id' : [11,22,33,44,55,66]
}
)
rating_table = pd.DataFrame({
'book_rating' : [1,3,2,5,6,5,7,8,9],
'book_id' : [11,33,44,22,55,22,33,33,11]
}
)
print(bookid_table)
print(rating_table)
print(pd.merge(bookid_table,rating_table))
print(pd.merge(bookid_table,rating_table,how='outer'))
print(pd.merge(bookid_table,rating_table,how='left'))
print(pd.merge(bookid_table,rating_table,how='right'))
print(pd.merge(bookid_table,rating_table,on='book_id'))
运行之后的结果如下:
book_name book_id
0 a 11
1 b 22
2 c 33
3 d 44
4 e 55
5 f 66
book_rating book_id
0 1 11
1 3 33
2 2 44
3 5 22
4 6 55
5 5 22
6 7 33
7 8 33
8 9 11
book_name book_id book_rating
0 a 11 1
1 a 11 9
2 b 22 5
3 b 22 5
4 c 33 3
5 c 33 7
6 c 33 8
7 d 44 2
8 e 55 6
book_name book_id book_rating
0 a 11 1.0
1 a 11 9.0
2 b 22 5.0
3 b 22 5.0
4 c 33 3.0
5 c 33 7.0
6 c 33 8.0
7 d 44 2.0
8 e 55 6.0
9 f 66 NaN
book_name book_id book_rating
0 a 11 1.0
1 a 11 9.0
2 b 22 5.0
3 b 22 5.0
4 c 33 3.0
5 c 33 7.0
6 c 33 8.0
7 d 44 2.0
8 e 55 6.0
9 f 66 NaN
book_name book_id book_rating
0 a 11 1
1 a 11 9
2 b 22 5
3 b 22 5
4 c 33 3
5 c 33 7
6 c 33 8
7 d 44 2
8 e 55 6
book_name book_id book_rating
0 a 11 1
1 a 11 9
2 b 22 5
3 b 22 5
4 c 33 3
5 c 33 7
6 c 33 8
7 d 44 2
8 e 55 6
[Finished in 5.2s]
如果两个数据库中的外键值不一样,可以使用left_on和right_on进行指定:
bookid_table = pd.DataFrame({
'book_name' : ['a','b','c','d','e','f'],
'id' : [11,22,33,44,55,66]
}
)
rating_table = pd.DataFrame({
'book_rating' : [1,3,2,5,6,5,7,8,9],
'book_id' : [11,33,44,22,55,22,33,33,11]
}
)
print(pd.merge(bookid_table,rating_table,left_on='id',right_on='book_id'))
结果如下:
book_name id book_rating book_id
0 a 11 1 11
1 a 11 9 11
2 b 22 5 22
3 b 22 5 22
4 c 33 3 33
5 c 33 7 33
6 c 33 8 33
7 d 44 2 44
8 e 55 6 55
[Finished in 4.7s]
关于对key的理解
我们可以认为:merge方法,通过key来决定合并之后的是否为一条记录,然后进行链接,同一个记录只占用一行,当然key也可以通过组合的方式生成组合键,只有组合键中的所有元素都相同,我们才认为是同一条记录。