pandas系列之横向拼接(二)连接键的类型

379 阅读3分钟

书接前文,当待连接的两个表里没有公共列时(这里是指列的实际内容是一样的,但是列名不同),需要指定公共列才可以进行拼接。

商品信息表

image-20210801112646658.png

用户购物表

image-20210801113021656.png

1 指定普通列名作为连接键

这个时候需要分别使用left_on、right_on来指定左表用作连接的键名、右表用作连接的键名

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, left_on="编号", right_on='商品代码')
print(new_df)

result:

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

2 指定索引作为连接键

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

result:

Index(['分类', '编号', '名称'], dtype='object')
user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户购物表.xlsx')
print(user_df.columns)

result:

Index(['用户名', '商品代码', '货物'], dtype='object')

由此可以看到,编号和商品名称这2个也是各自的表对应的索引,因此也可以设置left_index、right_index的值为True来指定两表使用索引作为连接键

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

result:

     分类  编号   名称 用户名  商品代码    货物
​
0    水果   0   苹果  小明     0    苹果
1    水果   1   橙子  小明     2    牙刷
2  生活用品   2   牙刷  小明     4   电视机
3  生活用品   3   冰箱  小刚     7  暖手宝宝
4  生活用品   4  电视机  小刚     5    茶几
5    食物   0   苹果  小刚     4   电视机
6    食物   1   橙子  小刚     3    冰箱

3 普通列名和索引进行混用

import pandas as pd
goods_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\商品信息表.xlsx')
user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户购物表.xlsx')
new_df = pd.merge(goods_df, user_df, left_index=True, right_on='商品代码')
print(new_df)

result:

     分类  编号   名称 用户名  商品代码    货物
​
0    水果   0   苹果  小明     0    苹果
1    水果   1   橙子  小明     2    牙刷
2  生活用品   2   牙刷  小明     4   电视机
3  生活用品   3   冰箱  小刚     7  暖手宝宝
4  生活用品   4  电视机  小刚     5    茶几
5    食物   0   苹果  小刚     4   电视机
6    食物   1   橙子  小刚     3    冰箱