Pandas合并之Merge合并

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









猜你喜欢

转载自blog.csdn.net/baoshuowl/article/details/79865084