目录
上次介绍了pandas
的多条件筛选,这些都是一些数据处理的必要技能,也不贪多,咱们每次学习一点。
这次咱们说说pandas
的两个表的连接技能merge
,也就是根据一个表的条件去匹配另一个表的内容。
话不多说,直接正文。
准备数据
先导入模块
import pandas as pd df1 = pd.DataFrame({ \'姓名\': [\'张三\', \'李四\', \'王五\', \'刘六\', \'齐四\'], \'号码\': [\'123\', \'456\', \'789\', \'987\', \'654\'] }) df2 = pd.DataFrame({ \'姓名\': [\'张三\', \'张三\', \'张三\', \'李四\', \'李四\', \'李四\', \'李四\', \'王五\', \'王五\', \'刘玉\', \'胡军\', \'刘玉\', \'刘六\', \'刘六\', \'刘六\', \'刘六\', \'刘克\', \'刘玉\', \'齐七\', \'齐七\', \'齐七\', \'齐七\', \'冯亮\', \'刘玉\', \'王云\'], \'号码\': [\'123\', \'123\', \'123\', \'123\', \'123\', \'456\', \'456\', \'456\', \'456\', \'456\', \'741\', \'741\', \'741\', \'741\', \'741\', \'789\', \'789\', \'789\', \'789\', \'789\', \'852\', \'852\', \'852\', \'852\', \'852\'], \'日期\': [\'2022-03-13\', \'2022-03-06\', \'2022-01-30\', \'2022-01-04\', \'2022-02-26\', \'2022-03-26\', \'2022-03-06\', \'2022-01-30\', \'2022-01-29\', \'2022-03-13\', \'2022-03-06\', \'2022-02-19\', \'2022-02-04\', \'2022-03-10\', \'2022-04-19\', \'2022-03-10\', \'2022-01-29\', \'2022-02-19\', \'2022-03-06\', \'2022-03-26\', \'2022-01-04\', \'2022-02-04\', \'2022-04-19\', \'2022-02-26\', \'2022-03-06\'], \'方案\': [\'G1012\', \'G1022\', \'G1002\', \'G1007\', \'G1017\', \'G1023\', \'G1018\', \'G1003\', \'G1008\', \'G1013\', \'G1020\', \'G1015\', \'G1010\', \'G1005\', \'G1025\', \'G1004\', \'G1009\', \'G1014\', \'G1019\', \'G1024\', \'G1006\', \'G1011\', \'G1026\', \'G1016\', \'G1021\'] })
输出内容
df1内容
姓名 号码
0 张三 123
1 李四 456
2 王五 789
3 刘六 987
4 齐四 654
df2内容:
姓名 号码 日期 方案
0 张三 123 2022-03-13 G1012
1 张三 123 2022-03-06 G1022
2 张三 123 2022-01-30 G1002
3 李四 123 2022-01-04 G1007
4 李四 123 2022-02-26 G1017
5 李四 456 2022-03-26 G1023
6 李四 456 2022-03-06 G1018
7 王五 456 2022-01-30 G1003
8 王五 456 2022-01-29 G1008
9 刘玉 456 2022-03-13 G1013
10 胡军 741 2022-03-06 G1020
11 刘玉 741 2022-02-19 G1015
12 刘六 741 2022-02-04 G1010
13 刘六 741 2022-03-10 G1005
14 刘六 741 2022-04-19 G1025
15 刘六 789 2022-03-10 G1004
16 刘克 789 2022-01-29 G1009
17 刘玉 789 2022-02-19 G1014
18 齐七 789 2022-03-06 G1019
19 齐七 789 2022-03-26 G1024
20 齐七 852 2022-01-04 G1006
21 齐七 852 2022-02-04 G1011
22 冯亮 852 2022-04-19 G1026
23 刘玉 852 2022-02-26 G1016
24 王云 852 2022-03-06 G1021
连接
函数说明:pd.merge(left=df1(需要匹配的原始表), right=df2(被匹配的数据表), on="姓名"(需要匹配的条件列), how="inner"(连接方式))
内连接
how
默认为inner
:内连接查询特点是df1
有匹配的才显示,不匹配的不显示
df = pd.merge(left=df1, right=df2, on=\"姓名\", how=\"inner\")
输出:
姓名 号码_x 号码_y 日期 方案
0 张三 123 123 2022-03-13 G1012
1 张三 123 123 2022-03-06 G1022
2 张三 123 123 2022-01-30 G1002
3 李四 456 123 2022-01-04 G1007
4 李四 456 123 2022-02-26 G1017
5 李四 456 456 2022-03-26 G1023
6 李四 456 456 2022-03-06 G1018
7 王五 789 456 2022-01-30 G1003
8 王五 789 456 2022-01-29 G1008
9 刘六 987 741 2022-02-04 G1010
10 刘六 987 741 2022-03-10 G1005
11 刘六 987 741 2022-04-19 G1025
12 刘六 987 789 2022-03-10 G1004
df1
表里需要匹配的姓名里,在df2
里面能匹配上姓名的都会列出来,而匹配不上的,都不会列出来,包括df1
里面的内容
小提示:如果两表有相同列名的,会自动在列名后面加_x
,_y
来区分
外连接
how="outer"
为外连接:查询特点是无论匹不匹配
都显示,对应的值没有则显示空
df = pd.merge(left=df1, right=df2, on=\"姓名\", how=\"outer\")
输出:
姓名 号码_x 号码_y 日期 方案
0 张三 123 123 2022-03-13 G1012
1 张三 123 123 2022-03-06 G1022
2 张三 123 123 2022-01-30 G1002
3 李四 456 123 2022-01-04 G1007
4 李四 456 123 2022-02-26 G1017
5 李四 456 456 2022-03-26 G1023
6 李四 456 456 2022-03-06 G1018
7 王五 789 456 2022-01-30 G1003
8 王五 789 456 2022-01-29 G1008
9 刘六 987 741 2022-02-04 G1010
10 刘六 987 741 2022-03-10 G1005
11 刘六 987 741 2022-04-19 G1025
12 刘六 987 789 2022-03-10 G1004
13 齐四 654 NaN NaN NaN
14 刘玉 NaN 456 2022-03-13 G1013
15 刘玉 NaN 741 2022-02-19 G1015
16 刘玉 NaN 789 2022-02-19 G1014
17 刘玉 NaN 852 2022-02-26 G1016
18 胡军 NaN 741 2022-03-06 G1020
19 刘克 NaN 789 2022-01-29 G1009
20 齐七 NaN 789 2022-03-06 G1019
21 齐七 NaN 789 2022-03-26 G1024
22 齐七 NaN 852 2022-01-04 G1006
23 齐七 NaN 852 2022-02-04 G1011
24 冯亮 NaN 852 2022-04-19 G1026
25 王云 NaN 852 2022-03-06 G1021
df1
表里索引13
里的齐四
无匹配,是空值,而在df2
里面的内容都会列出来,和df1
匹配不上的其它列的内容也是空值
注意:这有点互相匹配的意思哟
左连接
how="left"
为左连接:查询表示左边的值全部显示,如右边无匹配则显示空。但是右边有的值匹配不了左边则不显示
df = pd.merge(left=df1, right=df2, on=\"姓名\", how=\"outer\")
输出:
姓名 号码_x 号码_y 日期 方案
0 张三 123 123 2022-03-13 G1012
1 张三 123 123 2022-03-06 G1022
2 张三 123 123 2022-01-30 G1002
3 李四 456 123 2022-01-04 G1007
4 李四 456 123 2022-02-26 G1017
5 李四 456 456 2022-03-26 G1023
6 李四 456 456 2022-03-06 G1018
7 王五 789 456 2022-01-30 G1003
8 王五 789 456 2022-01-29 G1008
9 刘六 987 741 2022-02-04 G1010
10 刘六 987 741 2022-03-10 G1005
11 刘六 987 741 2022-04-19 G1025
12 刘六 987 789 2022-03-10 G1004
13 齐四 654 NaN NaN NaN
df1
表里索引13
里的齐四
还是无匹配,是空值,而在df2
里面的内容就不会列出来了
右连接
how="right"
为右连接:与左连接相反
df = pd.merge(left=df1, right=df2, on=\"姓名\", how=\"right\")
输出:
姓名 号码_x 号码_y 日期 方案
0 张三 123 123 2022-03-13 G1012
1 张三 123 123 2022-03-06 G1022
2 张三 123 123 2022-01-30 G1002
3 李四 456 123 2022-01-04 G1007
4 李四 456 123 2022-02-26 G1017
5 李四 456 456 2022-03-26 G1023
6 李四 456 456 2022-03-06 G1018
7 王五 789 456 2022-01-30 G1003
8 王五 789 456 2022-01-29 G1008
9 刘玉 NaN 456 2022-03-13 G1013
10 胡军 NaN 741 2022-03-06 G1020
11 刘玉 NaN 741 2022-02-19 G1015
12 刘六 987 741 2022-02-04 G1010
13 刘六 987 741 2022-03-10 G1005
14 刘六 987 741 2022-04-19 G1025
15 刘六 987 789 2022-03-10 G1004
16 刘克 NaN 789 2022-01-29 G1009
17 刘玉 NaN 789 2022-02-19 G1014
18 齐七 NaN 789 2022-03-06 G1019
19 齐七 NaN 789 2022-03-26 G1024
20 齐七 NaN 852 2022-01-04 G1006
21 齐七 NaN 852 2022-02-04 G1011
22 冯亮 NaN 852 2022-04-19 G1026
23 刘玉 NaN 852 2022-02-26 G1016
24 王云 NaN 852 2022-03-06 G1021
右连接正好与左连接相反,df1
里面匹配不上的不显示,df2
里面的内容全都出来了,匹配不上df1
的其它列值则为空值
PS这完全是反向匹配呀
暂无评论内容