数据分析(十九)

18. 数据连接

定义:根据单个或者多个键将不同的dataframe对象的行连接起来

18.1 merge

18.1.1 有相同的键名
>>> df1 = pd.DataFrame(
...    {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8)}
...)
>>> df1
    key1  data1
0    a      7
1    b      7
2    c     -2
3    d      8
4    e     -5
5    f      6
6    g     -4
7    h     -3

>>> df2 = pd.DataFrame(
...    {'key1':list('abcde'),'data2':np.random.randint(-5,10,5)}
...)
>>> df2
    key1  data2
0    a      7
1    b     -4
2    c      3
3    d      2
4    e      4
>>> pd.merge(df1,df2)
  key1	data1	data2
0	a	 7	     7
1	b	 7	    -4
2	c	-2    	 3
3	d	 8	     2
4	e	-5	     4

>>> pd.merge(df1,df2,on='key1')
  key1	data1	data2
0	a	 7	     7
1	b	 7	    -4
2	c	-2    	 3
3	d	 8	     2
4	e	-5	     4

注意点:

  1. 两张表进行连接的过程中,如果没有指定,默认使用的是dataframe对象的同名的列作为外键进行关联
  2. 如果同名的列很多,就可以通过on来指定外键
18.1.2 不同的键名
>>> df3 = pd.DataFrame(
...    {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8)}
...)
>>> df3
  key1	data1
0	a	-2
1	b	 3
2	c	 2
3	d	-1
4	e	 7
5	f	 2
6	g	 0
7	h	-3

>>> df4 = pd.DataFrame(
...    {'key2':list('abcdemn'),'data2':np.random.randint(-5,10,7)}
...)
>>> df4
   key2	data2
0	a	 4
1	b	-3
2	c	-2
3	d	-5
4	e	 8
5	m	 7
6	n	 1
>>> pd.merge(df3,df4,left_on='key1',right_on='key2')
  key1	data1	key2	data2
0	a	-2	     a	     4
1	b	 3	     b	    -3
2	c	 2	     c	    -2
3	d	-1	     d	    -5
4	e	 7	     e	     8

# 默认内连接,使用外连接
>>> pd.merge(df3,df4,left_on='key1',right_on='key2',how='outer')
   key1	data1	key2	data2
0	a	-2.0	 a	    4.0
1	b	 3.0	 b	   -3.0
2	c	 2.0	 c	   -2.0
3	d	-1.0	 d	   -5.0
4	e	 7.0	 e	    8.0
5	f	 2.0	NaN	    NaN
6	g	 0.0	NaN	    NaN
7	h	-3.0	NaN	    NaN
8	NaN	 NaN	 m	    7.0
9	NaN	 NaN	 n	    1.0

# 左连接,左边为主表,右边填充nan 
>>> pd.merge(df3,df4,left_on='key1',right_on='key2',how='left')
  key1	data1	key2	data2
0	a	-2  	 a  	 4.0
1	b	 3  	 b  	-3.0
2	c	 2  	 c  	-2.0
3	d	-1  	 d  	-5.0
4	e	 7  	 e  	 8.0
5	f	 2  	NaN  	 NaN
6	g	 0  	NaN 	 NaN
7	h	-3  	NaN 	 NaN

# 右连接
>>> pd.merge(df3,df4,left_on='key1',right_on='key2',how='right')
    key1	data1	key2	data2
0	 a  	-2.0	 a		 4
1	 b  	 3.0	 b		-3
2	 c  	 2.0	 c		-2
3	 d  	-1.0	 d		-5
4	 e  	 7.0	 e		 8
5	NaN  	NaN	     m		 7
6	NaN  	NaN	     n		 1

注意点:

  1. 当两张表没有同名的列的时候,可以通过left_onright_on来指定连接的条件(列)
  2. how=inner默认的,内连接:多表的交集
  3. how=outer,外连接:多表的并集
  4. how=left,左连接,展示左表的完整数据,不管右表有没有匹配
  5. how=right,右连接,不管左表有没有匹配,完整的展示右表的数据
18.3 相同键名,相同值
>>> df5 = pd.DataFrame(
...    {'key1':list('abcdefgh'),'data':np.random.randint(-5,10,8)}
...)
>>> df5
  key1	data
0	a	 7
1	b	 3
2	c	 9
3	d	 2
4	e	-2
5	f	-1
6	g	-4
7	h	 8

>>> df6 = pd.DataFrame(
...    {'key1':list('abcdemn'),'data':np.random.randint(-5,10,7)}
...)
>>> df6
  key1	data
0	a	-1
1	b	 9
2	c	 3
3	d	 4
4	e	 0
5	m	 5
6	n	-3
# 自动更改 值的名字
>>> pd.merge(df5,df6,on='key1')
   key1	data_x	data_y
0	a	  7	     -1
1	b	  3	      9
2	c	  9		  3
3	d	  2		  4
4	e	 -2	 	  0

# 自己取名
>>> pd.merge(df5,df6,on='key1',suffixes=['左表','右表'])
   key1	data左表 data右表
0	a	  7	     -1
1	b	  3	      9
2	c	  9		  3
3	d	  2		  4
4	e	 -2	 	  0

>>> pd.merge(df5,df6,right_index=True,left_index=True)
  key1_x	data_x	key1_y	data_y
0	a		  7		  a	  	 -1
1	b		  3		  b	 	  9
2	c		  9	 	  c		  3
3	d		  2	  	  d		  4
4	e		 -2		  e		  0
5	f		 -1		  m		  5
6	g		 -4	 	  n		 -3

注意点:

  1. 如果两个对象出现同名的列的时候,默认是将_x_y加在左右表的同名列名上

  2. suffixes=['左表','右表'],用来指定同名列的后缀,参数列表的顺序就是左右表的顺序

  3. left_on:指定左表的列作为外键

    right_on:指定右表的列作为外键

  4. left_index,right_index:默认情况下,将两张表按照行索引相同的情况,合成一条数据

  5. 按照 行 进行连接,也可以指定连接方式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值