文章目录
- Merge语法
- 数据集介绍
- merge实现
- 理解merge时数量的对齐关系
- one-to-one 一对一关系的merge
- one-to-many 一对多关系的merge
- many-to-many 多对多关系的merge
- 理解left join、right join、inner join、outer join的区别
- 如果出现非Key的字段重名怎么办
如何把不同的DataFrame
数据Merge
成一个大表?Pandas的Merge,相当于Sql的Join,将不同的表按key关联到一个表。
Merge语法
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
- left,right:要merge的dataframe或者有name的Series。
- how:join类型,‘left’, ‘right’, ‘outer’, ‘inner’。
- on:join的key,left和right都需要有这个key。
- left_on:left的df或者series的key。
- right_on:right的df或者seires的key。
- left_index,right_index:使用index而不是普通的column做join。
- suffixes:两个元素的后缀,如果列有重名,自动添加后缀,默认是(‘_x’, ‘_y’)。
- 文档地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html
数据集介绍
包含三个文件:
- 用户对电影的评分数据
ratings.dat
- 用户本身的信息数据
users.dat
- 电影本身的数据
movies.dat
由于这三个数据集是有关系的,因此可以关联三个表,得到一个完整的大表。
- 数据集官方地址:https://grouplens.org/datasets/movielens/
- 读取用户对电影的评分数据 ratings.dat:
数据中的UserID
和MovieID
可以实现关联。这里设置engine='python'
是为了不让编译器认为"::"
是正则表达式。
- 读取用户本身的信息数据 users.dat:
- 读取电影本身的数据 movies.dat:
merge实现
对df_ratings
和df_users
进行merge
,merge
的依据就是左边left_on="UserID"
,右边right_on="UserID"
, how="inner"
表示两边都有的数据才会被merge
:
对df_ratings_users
和df_movies
的merge
也是类似:
理解merge时数量的对齐关系
以下关系要正确理解:
- one-to-one:一对一关系,关联的
key
都是唯一的
- 比如(学号,姓名)
merge
(学号,年龄) - 结果条数为:1*1
- one-to-many:一对多关系,左边唯一
key
,右边不唯一key
。
- 比如(学号,姓名)
merge
(学号,[语文成绩、数学成绩、英语成绩]) - 结果条数为:1*N
- many-to-many:多对多关系,左边右边都不是唯一的
- 比如(学号,[语文成绩、数学成绩、英语成绩])
merge
(学号,[篮球、足球、乒乓球]) - 结果条数为:M*N
one-to-one 一对一关系的merge
代码实现:
one-to-many 一对多关系的merge
从这里开始就要注意数据会被复制:
代码实现:
many-to-many 多对多关系的merge
代码实现:
理解left join、right join、inner join、outer join的区别
merge
时how
的选择方式有以下几种:
- 创建两个
dataframe
:
可以看到K0
和K1
是都有的,其余两个是各自的,由此可以有四种方式merge
:
- inner join,默认:
- left join:
- right join:
- outer join:
如果出现非Key的字段重名怎么办