数据合并
数据连接
-
根据单个或者多个键(列)将不同的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:对两张表都有的键的交集进行联合:
扫描二维码关注公众号,回复:
10146174 查看本文章
- 全连接 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