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
注意点:
- 两张表进行连接的过程中,如果没有指定,默认使用的是dataframe对象的同名的列作为外键进行关联
- 如果同名的列很多,就可以通过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
注意点:
- 当两张表没有同名的列的时候,可以通过
left_on
,right_on
来指定连接的条件(列) how=inner
,默认的,内连接:多表的交集how=outer
,外连接:多表的并集how=left
,左连接,展示左表的完整数据,不管右表有没有匹配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
注意点:
-
如果两个对象出现同名的列的时候,默认是将
_x
和_y
加在左右表的同名列名上 -
suffixes=['左表','右表']
,用来指定同名列的后缀,参数列表的顺序就是左右表的顺序 -
left_on
:指定左表的列作为外键right_on
:指定右表的列作为外键 -
left_index,right_index
:默认情况下,将两张表按照行索引相同的情况,合成一条数据 -
按照 行 进行连接,也可以指定连接方式