数据分析学习之数据规整(1)

数据合并

数据连接

  • 根据单个或者多个键(列)将不同的DataFrame的行进行连接

  • 类似数据的连接操作

  • pd.merge:(left, right, how=‘inner’,on=None,left_on=None, right_on=None )

    left:合并时左边的DataFrame

    right:合并时右边的DataFrame

    how:合并的方式,默认’inner’, ‘outer’, ‘left’, ‘right’

    on:需要合并的列名,必须两边都有的列名,并以 left 和 right 中的列名的交集作为连接键

    left_on: left Dataframe中用作连接键的列

    right_on: right Dataframe中用作连接键的列

  • 内连接 inner:对两张表都有的键的交集进行联合:

在这里插入图片描述

  • 全连接 outer:对两者表的都有的键的并集进行联合:
    在这里插入图片描述
  • 左连接 left:对所有左表的键进行联合:
    *在这里插入图片描述
  • 右连接 right:对所有右表的键进行联合;
    在这里插入图片描述
    下面进行代码演示:
# 我们首先创建一个dataframe
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

	key	A	B
0	K0	A0	B0
1	K1	A1	B1
2	K2	A2	B2
3	K3	A3	B3

right

	key	C	D
0	K0	C0	D0
1	K1	C1	D1
2	K2	C2	D2
3	K3	C3	D3


# 默认how='inner' 也就是内连接 选取两个dataframe中共有的列进行连接
# how 指定按照什么方式进行连接 on 指定那一列(当有多列列名相同的时候)
pd.merge(left,right)
# 效果
	key	A	B	C	D
0	K0	A0	B0	C0	D0
1	K1	A1	B1	C1	D1
2	K2	A2	B2	C2	D2
3	K3	A3	B3	C3	D3

下面我们创建一个有两个列名相同的DataFrame来进行连接

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                    'key2': ['K0', 'K1', 'K0', 'K1'],
                    'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
         
left

	key1	key2	A	B
0	K0		K0		A0	B0
1	K0		K1		A1	B1
2	K1		K0		A2	B2
3	K2		K1		A3	B3

right

	key1	key2	C	D
0	K0		K0		C0	D0
1	K1		K0		C1	D1
2	K1		K0		C2	D2
3	K2		K0		C3	D3

pd.merge(left,right,on=['key1','key2']) #指定多个键,进行合并 
# how='inner' 默认不会出现nan值 但是outer left right就有可能出现
# 因为inner 是两个dataframe都有的
	key1	key2	A	B	C	D
0	K0		K0		A0	B0	C0	D0
1	K1		K0		A2	B2	C1	D1
2	K1		K0		A2	B2	C2	D2

# 指定单一的列 当有两个列名字相同的时候
pd.merge(left,right,on='key1')   
# 其中的xy 是值left中key2 和 right中的key2

	key1	key2_x	A	B	key2_y	C	D
0	K0		K0		A0	B0		K0	C0	D0
1	K0		K1		A1	B1		K0	C0	D0
2	K1		K0		A2	B2		K0	C1	D1
3	K1		K0		A2	B2		K0	C2	D2
4	K2		K1		A3	B3		K0	C3	D3

# # 也可以设置参数改变 _x _y
pd.merge(left,right,on='key1',suffixes=('_left','_right'))
# 这样我们就更能明白了

	key1	key2_left	A	B	key2_right	C	D
0	K0		K0			A0	B0			K0	C0	D0
1	K0		K1			A1	B1			K0	C0	D0
2	K1		K0			A2	B2			K0	C1	D1
3	K1		K0			A2	B2			K0	C2	D2
4	K2		K1			A3	B3			K0	C3	D3


  • 关于how=‘inner’ ‘outer’ ‘left’ ‘right’
  • ‘inner’ 是把两个表中相同列名中的相同的键索引进行连接 不会出现nan
  • ‘outer’ 是把两个表中相同的列名中的所有对应关系都写入新表进行连接 会出现nan
  • ‘left’ 是把左边的表作为基准 进行连接 就是说两个表相同的列名 最后保存下来的键会全部是左边的表中的
  • ‘right’ 同理

左连接

# 左连接
pd.merge(left,right,on=['key1','key2'],how='left')

	key1	key2	A	B	C	D
0	K0		K0		A0	B0	C0	D0
1	K0		K1		A1	B1	NaN	NaN
2	K1		K0		A2	B2	C1	D1
3	K1		K0		A2	B2	C2	D2
4	K2		K1		A3	B3	NaN	NaN

右连接

pd.merge(left,right,on=['key1','key2'],how='right')

	key1	key2	A	B	C	D
0	K0		K0		A0	B0	C0	D0
1	K1		K0		A2	B2	C1	D1
2	K1		K0		A2	B2	C2	D2
3	K2		K0		NaN	NaN	C3	D3

全连接

pd.merge(left,right,on=['key1','key2'],how='outer')

	key1	key2	A	B	C	D
0	K0		K0		A0	B0	C0	D0
1	K0		K1		A1	B1	NaN	NaN
2	K1		K0		A2	B2	C1	D1
3	K1		K0		A2	B2	C2	D2
4	K2		K1		A3	B3	NaN	NaN
5	K2		K0		NaN	NaN	C3	D3

内连接

pd.merge(left,right,on=['key1','key2'],how='inner')

	key1	key2	A	B	C	D
0	K0		K0		A0	B0	C0	D0
1	K1		K0		A2	B2	C1	D1
2	K1		K0		A2	B2	C2	D2

按照索引连接

# 按索引连接
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
                        'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'data2' : np.random.randint(0,10,3)}, index=['a', 'b', 'd'])

df_obj1 
	key	data1
0	 b	  0
1	 b	  6
2	 a	  4
3	 c	  9
4	 a	  0
5	 a	  0
6	 b	  3

df_obj2 

	data2
a	  3
b	  6
d	  7

# 从上面两个表中我们发现 df_obj2 和 df_obj1 他们的索引一个是0-n 一个是a-    但是在 df_obj1 中key里面却也是a- 
# 所以我们可以用2表的索引 和 1表中key列进行连接
# left_on 是指根据左表的key列名进行合并
# right_on 是指根据右表的索引
#
pd.merge(df_obj1,df_obj2,left_on='key',right_index=True)

	key	data1	data2
0	 b	  0	      6
1	 b	  6		  6
6	 b	  3		  6
2	 a	  4		  3
4	 a	  0	 	  3
5	 a	  0		  3
发布了21 篇原创文章 · 获赞 12 · 访问量 435

猜你喜欢

转载自blog.csdn.net/weixin_44984627/article/details/104861784