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 '''