pandas系列之横向拼接(一)连接表的类型

957 阅读7分钟

表的横向拼接就是在横向将两个表依据公共列拼接在一起,本文主要依靠merge方法来进行相关操作 连接表的类型关注的就是待连接的两个表都是什么类型,主要三种情形:一对一、多对一、多对多 为了便于讨论,这里默认合并的两个表有公共列

1 一对一拼接

一对一拼接就是说待拼接的两个表的公共列是一对一的

成绩表:

image-20210731151459700.png

学生信息表:

image-20210731151518939.png

import pandas as pd
​
score_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\成绩表.xlsx')
print(score_df)

result:

   学号  姓名  成绩  排名
0   0  小明  90   3
1   1  小刚  89   4
2   2  小红  98   1
3   3  小兰  63   7
4   4  李华  95   2
5   5  张三  23   9
6   6  李四  56   8
7   7  王五  85   5
8   8  小张  72   6
info_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\学生信息表.xlsx')
print(info_df)

result:

   学号   年级  班级
0   0  三年级  二班
1   1  五年级  三班
2   2  六年级  一班
3   3  一年级  五班
4   4  三年级  二班
5   5  四年级  三班
6   6  三年级  二班
7   7  二年级  一班
8   8  五年级  二班
new_df = pd.merge(score_df, info_df)
print(new_df)

result:

   学号  姓名  成绩  排名   年级  班级
0   0  小明  90   3  三年级  二班
1   1  小刚  89   4  五年级  三班
2   2  小红  98   1  六年级  一班
3   3  小兰  63   7  一年级  五班
4   4  李华  95   2  三年级  二班
5   5  张三  23   9  四年级  三班
6   6  李四  56   8  三年级  二班
7   7  王五  85   5  二年级  一班
8   8  小张  75   6  五年级  二班

此时该方法会自动寻找两个表中的公共列,并将找到的公共列作为连接列。在这个例子中学号这一列是作为成绩表和学生信息表这2个表的连接列进行连接的。

2 多对一拼接

多对一连接就是待连接的两个表的公共列不是一对一的,其中一个表的公共列有重复值,另一个表的公共列是唯一的。

成绩表:

image-20210731152715133.png

学生信息表:

image-20210731151518939.png

import pandas as pd
​
score_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\成绩表.xlsx')
print(score_df)

result:

    学号  姓名   成绩 考试时间
​
0    0  小明   90   期中
1    1  小刚   89   期末
2    2  小红   98   期中
3    3  小兰   63   期末
4    4  李华   95   期中
5    5  张三   23   期末
6    6  李四   56   期中
7    7  王五   85   期末
8    8  小张   75   期中
9    0  小明   90   期末
10   1  小刚  148   期中
11   2  小红  125   期末
12   3  小兰  115   期中
13   4  李华  150   期末
14   5  张三   89   期中
15   6  李四   45   期末
16   7  王五  135   期中
17   8  小张  126   期末
info_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\学生信息表.xlsx')
print(info_df)

result:

   学号   年级  班级
0   0  三年级  二班
1   1  五年级  三班
2   2  六年级  一班
3   3  一年级  五班
4   4  三年级  二班
5   5  四年级  三班
6   6  三年级  二班
7   7  二年级  一班
8   8  五年级  二班
new_df = pd.merge(score_df, info_df)
print(new_df)

result:

    学号  姓名   成绩 考试时间   年级  班级
0    0  小明   90   期中  三年级  二班
1    0  小明   90   期末  三年级  二班
2    1  小刚   89   期末  五年级  三班
3    1  小刚  148   期中  五年级  三班
4    2  小红   98   期中  六年级  一班
5    2  小红  125   期末  六年级  一班
6    3  小兰   63   期末  一年级  五班
7    3  小兰  115   期中  一年级  五班
8    4  李华   95   期中  三年级  二班
9    4  李华  150   期末  三年级  二班
10   5  张三   23   期末  四年级  三班
11   5  张三   89   期中  四年级  三班
12   6  李四   56   期中  三年级  二班
13   6  李四   45   期末  三年级  二班
14   7  王五   85   期末  二年级  一班
15   7  王五  135   期中  二年级  一班
16   8  小张   75   期中  五年级  二班
17   8  小张  126   期末  五年级  二班

3 多对多拼接

多对多连接就是待连接的两个表的公共列不是一对一的,且2个表中的公共列都有重复值,多对多连接相当于多个多对一连接

商品信息表

image-20210731165142763.png

用户购物表

image-20210731171220078.png

import pandas as pd
​
goods_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\商品信息表.xlsx')
print(goods_df)

result:

      分类  商品编号 商品名称
​
0     水果     0   苹果
1     水果     1   橙子
2   生活用品     2   牙刷
3   生活用品     3   冰箱
4   生活用品     4  电视机
5     食物     0   苹果
6     食物     1   橙子
7     家电     3   冰箱
8     家电     4  电视机
9     大件     3   冰箱
10    大件     4  电视机
user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户购物表.xlsx')
print(user_df)

result:

  用户名  商品编号
0  小明     0
1  小明     2
2  小明     4
3  小刚     7
4  小刚     5
5  小刚     4
6  小刚     3
new_df = pd.merge(goods_df, user_df)
print(new_df)

result:

      分类  商品编号 商品名称 用户名
​
0     水果     0   苹果  小明
1     食物     0   苹果  小明
2   生活用品     2   牙刷  小明
3   生活用品     3   冰箱  小刚
4     家电     3   冰箱  小刚
5     大件     3   冰箱  小刚
6   生活用品     4  电视机  小明
7   生活用品     4  电视机  小刚
8     家电     4  电视机  小明
9     家电     4  电视机  小刚
10    大件     4  电视机  小明
11    大件     4  电视机  小刚

4 on参数的使用

on参数一般用于指定连接键,即两个表中的公共列。此时和前面使用默认的公共列效果是一样的

商品信息表

image-20210731165142763.png 用户购物表

image-20210731171220078.png

import pandas as pd
​
goods_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\商品信息表.xlsx')
print(goods_df)

result:

      分类  商品编号 商品名称
​
0     水果     0   苹果
1     水果     1   橙子
2   生活用品     2   牙刷
3   生活用品     3   冰箱
4   生活用品     4  电视机
5     食物     0   苹果
6     食物     1   橙子
7     家电     3   冰箱
8     家电     4  电视机
9     大件     3   冰箱
10    大件     4  电视机
user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户购物表.xlsx')
print(user_df)

result:

  用户名  商品编号
0  小明     0
1  小明     2
2  小明     4
3  小刚     7
4  小刚     5
5  小刚     4
6  小刚     3
new_df = pd.merge(goods_df, user_df, on=['商品编号'])
print(new_df)

result:

      分类  商品编号 商品名称 用户名
​
0     水果     0   苹果  小明
1     食物     0   苹果  小明
2   生活用品     2   牙刷  小明
3   生活用品     3   冰箱  小刚
4     家电     3   冰箱  小刚
5     大件     3   冰箱  小刚
6   生活用品     4  电视机  小明
7   生活用品     4  电视机  小刚
8     家电     4  电视机  小明
9     家电     4  电视机  小刚
10    大件     4  电视机  小明
11    大件     4  电视机  小刚

5 公共列有多列时的连接

商品信息表

image-20210731194918932.png

用户购物表

image-20210731194938517.png

import pandas as pd
​
goods_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\商品信息表.xlsx')
print(goods_df)

result:

      分类  商品编号  商品名称
​
0     水果     0    苹果
1     水果     1    橙子
2   生活用品     2    牙刷
3   生活用品     3    冰箱
4   生活用品     4   电视机
5     食物     0    苹果
6     食物     1    橙子
7     家电     3    冰箱
8     家电     4   电视机
9     大件     3    冰箱
10    大件     4   电视机
11    大件     5    茶几
12  生活用品     7  暖手宝宝
​
​
user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户购物表.xlsx')
print(user_df)

result:

  用户名  商品编号  商品名称
0  小明     0    苹果
1  小明     2    牙刷
2  小明     4   电视机
3  小刚     7  暖手宝宝
4  小刚     5    茶几
5  小刚     4   电视机
6  小刚     3    冰箱
new_df = pd.merge(goods_df, user_df)
print(new_df)

result:

      分类  商品编号  商品名称 用户名
​
0     水果     0    苹果  小明
1     食物     0    苹果  小明
2   生活用品     2    牙刷  小明
3   生活用品     3    冰箱  小刚
4     家电     3    冰箱  小刚
5     大件     3    冰箱  小刚
6   生活用品     4   电视机  小明
7   生活用品     4   电视机  小刚
8     家电     4   电视机  小明
9     家电     4   电视机  小刚
10    大件     4   电视机  小明
11    大件     4   电视机  小刚
12    大件     5    茶几  小刚
13  生活用品     7  暖手宝宝  小刚