1.Merge语法
merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False)
参数说明:
left,right:指左右两个DataFrame对象
how:默认情况下how='inner',how参数是指左右两个对象存在不重合的键时,取结果的方式,how='inner'取的是交集,how='outer'取的是并集,还有how='left',how='right',同时how='inter'称为内连接,outer称为外连接,left称为左连接,right称为右连接
on,left_on,right_on:默认情况下on=None,用来显示指定列名(键名),如果两个对象中的列名(键名)不相同时,可以分别使用left_on和right_on来分别指定两个对象的键名
left_index,right_index:如果想直接使用行索引作为连接键名的话,可以将left_index和right_index由原来的False设置为True
sort:默认情况下sort为True,将合并的数据进行排序,但是一般情况下sort设置为False可以提高性能
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
2.Merge范例
(1)两个对象中列名(键名)相同,都为key
1>直接merge(left,right)连接,how='inner'为默认,on=None为默认
#创建两个DataFrame对象
df_1 = pd.DataFrame({
'key':['a','b','c','d'],
'data':np.random.randint(1,5,4)
})
'''
data key
0 2 a
1 1 b
2 4 c
3 3 d
'''
df_2 = pd.DataFrame({
'key':['a','b','c','e','f'],
'data':np.random.randint(1,5,5)
})
'''
data key
0 2 a
1 1 b
2 4 c
3 3 d
'''
#直接使用merge合并
#how='inner'为默认,所以为内连接,取交集
#on没有指定的话,默认使用两个DataFrame对象的交集列名作为连接键
df = pd.merge(df_1,df_2,on='key',how='inner')
print(df)
'''
data_x key data_y
0 1 a 1
1 4 b 4
2 4 c 4
'''
(2)两个对象中列名(键名)不相同,分别为key1,key2
1>分别用left_on和right_on指定左右两个对象的键,并且使用inner内连接
#创建两个DataFrame对象
df_1 = pd.DataFrame({
'key1':['a','b','c','d'],
'data':np.random.randint(1,5,4)
})
'''
data key1
0 2 a
1 1 b
2 4 c
3 3 d
'''
df_2 = pd.DataFrame({
'key2':['a','b','c','e','f'],
'data':np.random.randint(1,5,5)
})
'''
data key2
0 2 a
1 1 b
2 4 c
3 3 d
'''
#使用left_on和right_on分别指定左右对象的键
#使用inner内连接,取对象的交集
df = pd.merge(df_1,df_2,left_on='key1',right_on='key2',how='inner')
print(df)
'''
data_x key1 data_y key2
0 1 a 1 a
1 4 b 2 b
2 2 c 2 c
'''
2>分别用left_on和right_on指定左右两个对象的键,并且使用outer内连接
#创建两个DataFrame对象
df_1 = pd.DataFrame({
'key1':['a','b','c','d'],
'data':np.random.randint(1,5,4)
})
'''
data key1
0 2 a
1 1 b
2 4 c
3 3 d
'''
df_2 = pd.DataFrame({
'key2':['a','b','c','e','f'],
'data':np.random.randint(1,5,5)
})
'''
data key2
0 2 a
1 1 b
2 4 c
3 3 d
'''
#使用outer外连接,取对象的并集
df = pd.merge(df_1,df_2,left_on='key1',right_on='key2',how='outer')
print(df)
#通过输出发现,对应位置上没有数据的全部自动填充为Nan
'''
data_x key1 data_y key2
0 1.0 a 2.0 a
1 4.0 b 4.0 b
2 2.0 c 2.0 c
3 1.0 d NaN NaN
4 NaN NaN 2.0 e
5 NaN NaN 1.0 f
'''
3>分别用left_on和right_on指定左右两个对象的键,并且使用left左连接
#创建两个DataFrame对象
df_1 = pd.DataFrame({
'key1':['a','b','c','d'],
'data':np.random.randint(1,5,4)
})
'''
data key1
0 2 a
1 1 b
2 4 c
3 3 d
'''
df_2 = pd.DataFrame({
'key2':['a','b','c','e','f'],
'data':np.random.randint(1,5,5)
})
'''
data key2
0 2 a
1 1 b
2 4 c
3 3 d
'''
#使用left左连接,优先保存左边对象数据的完整性
df = pd.merge(df_1,df_2,left_on='key1',right_on='key2',how='left')
print(df)
#从输入结果看出,优先保证左边数据的完整性,右边对应位置没有的数据自动填充Nan
'''
data_x key1 data_y key2
0 4 a 4.0 a
1 1 b 1.0 b
2 2 c 2.0 c
3 2 d NaN NaN
'''
4>分别用left_on和right_on指定左右两个对象的键,并且使用right右连接
#创建两个DataFrame对象
df_1 = pd.DataFrame({
'key1':['a','b','c','d'],
'data':np.random.randint(1,5,4)
})
'''
data key1
0 2 a
1 1 b
2 4 c
3 3 d
'''
df_2 = pd.DataFrame({
'key2':['a','b','c','e','f'],
'data':np.random.randint(1,5,5)
})
'''
data key2
0 2 a
1 1 b
2 4 c
3 3 d
'''
#使用right右连接,优先保存右边对象数据的完整性
df = pd.merge(df_1,df_2,left_on='key1',right_on='key2',how='right')
print(df)
#从输出结果看出,优先保证了右边数据的完整性,左边对应没有位置的数据自动填充为Nan
'''
data_x key1 data_y key2
0 2.0 a 1 a
1 4.0 b 3 b
2 1.0 c 4 c
3 NaN NaN 4 e
4 NaN NaN 4 f
'''
(3)使用对象的行索引作为连接键
# 按索引连接
df_1 = pd.DataFrame({
'key':['b','b','c','c','b','a','b'],
'data1':np.random.randint(1,10,7)
})
'''
data1 key
0 4 b
1 7 b
2 2 c
3 2 c
4 5 b
5 2 a
6 2 b
'''
df_2 = pd.DataFrame({
'data2':np.random.randint(0,10,3)},index=['a','b','c'])
'''
data2
a 8
b 1
c 2
'''
df = pd.merge(df1,df2,left_on='key',right_index=True,how='outer')
print(df)
'''
data1 key data2
0 8 b 6
1 9 b 6
4 5 b 6
6 9 b 6
2 3 c 5
3 8 c 5
5 3 a 4
'''
(4)处理重复列名
# 处理重复列名
df_1 = pd.DataFrame({
'key':['b','b','c','c','b','a','b'],
'data':np.random.randint(1,10,7)
})
'''
data key
0 7 b
1 7 b
2 3 c
3 3 c
4 9 b
5 3 a
6 7 b
'''
df_2 = pd.DataFrame({
'key':['a','b','d'],
'data':np.random.randint(1,10,3)
})
'''
data key
0 6 a
1 4 b
2 3 d
'''
df = pd.merge(df_1,df_2,on='key',suffixes=('_left','_right'))
print(df)
'''
data_left key data_right
0 7 b 4
1 7 b 4
2 9 b 4
3 7 b 4
4 3 a 6
'''