Pandas数据分析—实现DataFrame的Merge(合并)

10.Pandas实现DataFrame的Merge(合并)

文章目录

  • 10.Pandas实现DataFrame的Merge(合并)
  • 前言
    • Merge的语法:
  • 一、电影数据集的join实例
  • 二、程序演示
      • 1.合并不同表的信息
      • 2.理解merge时数量的对齐关系
      • 3.理解left join、right join、inner join、outer join的区别
      • 4. 如果出现非Key的字段重名怎么办
  • 总结


前言

笔者最近正在学习Pandas数据分析,将自己的学习笔记做成一套系列文章。本节主要记录Pandas中DataFrame的Merge

Pandas的Merge,相当于Sql的Join,将不同的表按key关联到一个表

Merge的语法:

DataFrame.merge(right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, 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或者series的key
  • left_index,right_index:使用index而不是普通的column做join
  • suffixes:两个元素的后缀,如果列有重名,自动添加后缀,默认是(’_x’,’_y’)

一、电影数据集的join实例

电影评分数据集
是推荐系统研究的很好的数据集,包含三个文件:

  1. 用户对电影的评分数据ratings.dat
  2. 用户本身的信息数据 users.dat
  3. 电影本身的数据 movie.dat
    可以关联三个表,得到一个完整的大表
    https://grouplens.org/datasets/movielens/

二、程序演示

提前读取数据

import pandas as pd

#当分隔符是"::"的时候,Pandas会认为是正则表达式,但是其实它不是正则表达式,我们用engine="python"来说明就可以了
df_ratings=pd.read_csv(
    "./datas/ml-1m/ratings.dat",
    sep="::",
    engine='python',
    names="UserID::MovieID::Rating::Timestamp".split("::")

)
df_ratings.head()

Pandas数据分析—实现DataFrame的Merge(合并)_第1张图片

df_users=pd.read_csv(
    "./datas/ml-1m/users.dat",
    sep="::",
    engine='python',
    names="UserID::Gender::Age::Occupation::Zip-code".split("::")

)
df_users.head()

Pandas数据分析—实现DataFrame的Merge(合并)_第2张图片

df_movies=pd.read_csv(
    "./datas/ml-1m/movies.dat",
    sep="::",
    engine='python',
    names="MovieID::Title::Genres".split("::")
)
df_movies.head()

Pandas数据分析—实现DataFrame的Merge(合并)_第3张图片

1.合并不同表的信息

df_ratings_users=pd.merge(
    df_ratings,df_users,left_on='UserID',right_on="UserID",how="inner"
)

df_ratings_users.head()

df_ratings_users_movies=pd.merge(       df_ratings_users,df_movies,left_on='MovieID',right_on='MovieID',how='inner'
)

df_ratings_users_movies.head(10)

Pandas数据分析—实现DataFrame的Merge(合并)_第4张图片
Pandas数据分析—实现DataFrame的Merge(合并)_第5张图片

2.理解merge时数量的对齐关系

以下关系要正确的理解:

  • one-to-one:一对一关系,关联的key都是唯一的
    • 比如(学号,姓名)merge(学号,姓名)
    • 结果条数为1*1
  • one-to-many: 一对多关系,左边唯一key,右边不唯一key
    • 比如(学号,姓名)merge (学号,[语文分数、数学分数、英语分数])
    • 结果条数:1*N
  • many-to-many:多对多关系,左边和右边都不是唯一的
    • 比如(学号,[语文分数、数学分数、英语分数]) merge (学号,[篮球、足球、乒乓球])
    • 结果条数为:M*N
#2.1 一对一关系
left=pd.DataFrame({
    'sno':[11,12,13,14],
    'name':['a','b','c','d']
})
left

right=pd.DataFrame({'sno':[11,12,13,14],
                   'age':['21','22','23','24']})
right

pd.merge(left,right,on='sno')                   

Pandas数据分析—实现DataFrame的Merge(合并)_第6张图片
Pandas数据分析—实现DataFrame的Merge(合并)_第7张图片

#2.2 一对多的关系
#注意:数据会被复制
left=pd.DataFrame({
    'sno':[11,12,13,14],
    'name':['a','b','c','d']
})
left

right=pd.DataFrame({'sno':[11,11,11,12,12,13],
                   'grade':['语文88','数学90','英语75','语文66','数学55','英语29']})
right

#数目以多的一边为准
pd.merge(left,right,on='sno')

Pandas数据分析—实现DataFrame的Merge(合并)_第8张图片
Pandas数据分析—实现DataFrame的Merge(合并)_第9张图片

#2.3 多对多关系
#注意:结果数量会出现乘法
left=pd.DataFrame({
    'sno':[11,11,12,12,12],
    '爱好':['篮球','羽毛球','乒乓球','篮球','足球']
})
left

right=pd.DataFrame({'sno':[11,11,11,12,12,13],
                   'grade':['语文88','数学90','英语75','语文66','数学55','英语29']})
right

pd.merge(left,right,on='sno')

Pandas数据分析—实现DataFrame的Merge(合并)_第10张图片
Pandas数据分析—实现DataFrame的Merge(合并)_第11张图片

3.理解left join、right join、inner join、outer join的区别

left=pd.DataFrame({
    'key':['K0','K1','K2','K3'],
    'A':['A0','A1','A2','A3'],
    'B':['B0','B1','B2','B3']
})
right=pd.DataFrame({
    'key':['K0','K1','K2','K3'],
    'C':['C0','C1','C2','C3'],
    'D':['D0','D1','D2','D3']
})
left
right

Pandas数据分析—实现DataFrame的Merge(合并)_第12张图片

#3.1 inner join 默认
#左边和右边的key都有,才会出现在结果里
pd.merge(left,right,how='inner')

Pandas数据分析—实现DataFrame的Merge(合并)_第13张图片

#3.2 left join
#左边的都会出现在结果里,右边的如果无法匹配则为Null
pd.merge(left,right,how='left')

Pandas数据分析—实现DataFrame的Merge(合并)_第14张图片

#3.3 right join
#右边的都会出现在结果里,左边的如果无法匹配则为Null
pd.merge(left,right,how='right')

Pandas数据分析—实现DataFrame的Merge(合并)_第15张图片

#3.4 outer join
#左边和右边的都会出现在结果里,如果无法匹配则为Null
pd.merge(left,right,how='outer')

Pandas数据分析—实现DataFrame的Merge(合并)_第16张图片

4. 如果出现非Key的字段重名怎么办

left=pd.DataFrame({
    'key':['K0','K1','K2','K3'],
    'A':['A0','A1','A2','A3'],
    'B':['B0','B1','B2','B3']
})
right=pd.DataFrame({
    'key':['K0','K1','K2','K3'],
    'A':['C0','C1','C2','C3'],
    'D':['D0','D1','D2','D3']
})
left
right
pd.merge(left,right,on='key')
pd.merge(left,right,on='key',suffixes=('_left','_right'))

Pandas数据分析—实现DataFrame的Merge(合并)_第17张图片

Pandas数据分析—实现DataFrame的Merge(合并)_第18张图片

总结

这就是pandas的DataFrame的Merge的基本用法了,希望可以帮助到你。

你可能感兴趣的:(pandas,python)