最近在工作中,遇到了数据合并、连接的问题,故整理如下,供需要者参考~
一、concat:沿着一条轴,将多个对象堆叠到一起
concat方法相当于数据库中的全连接(union all),它不仅可以指定连接的方式(outer join或inner join)还可以指定按照某个轴进行连接。与数据库不同的是,它不会去重,但是可以使用drop_duplicates方法达到去重的效果。
1
2
|
concat(objs, axis = 0 , join = 'outer' , join_axes = None , ignore_index = False ,
keys = None , levels = None , names = None , verify_integrity = False , copy = True ):
|
pd.concat()只是单纯的把两个表拼接在一起,参数axis是关键,它用于指定是行还是列,axis默认是0。
当axis=0时,pd.concat([obj1, obj2])的效果与obj1.append(obj2)是相同的;当axis=1时,pd.concat([obj1, obj2], axis=1)的效果与pd.merge(obj1, obj2, left_index=True, right_index=True, how='outer')是相同的。
merge方法的介绍请参看下文。
参数介绍:
objs:需要连接的对象集合,一般是列表或字典;
axis:连接轴向;
join:参数为‘outer'或‘inner';
join_axes=[]:指定自定义的索引;
keys=[]:创建层次化索引;
ignore_index=True:重建索引
举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
df1 = DataFrame(np.random.randn( 3 , 4 ),columns = [ 'a' , 'b' , 'c' , 'd' ])
df2 = DataFrame(np.random.randn( 2 , 3 ),columns = [ 'b' , 'd' , 'a' ])
pd.concat([df1,df2])
a b c d
0 - 0.848557 - 1.163877 - 0.306148 - 1.163944
1 1.358759 1.159369 - 0.532110 2.183934
2 0.532117 0.788350 0.703752 - 2.620643
0 - 0.316156 - 0.707832 NaN - 0.416589
1 0.406830 1.345932 NaN - 1.874817
pd.concat([df1,df2],ignore_index = True )
a b c d
0 - 0.848557 - 1.163877 - 0.306148 - 1.163944
1 1.358759 1.159369 - 0.532110 2.183934
2 0.532117 0.788350 0.703752 - 2.620643
3 - 0.316156 - 0.707832 NaN - 0.416589
4 0.406830 1.345932 NaN - 1.874817
|
二、merge:通过键拼接列
类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。该函数的典型应用场景是,针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。
1
2
3
|
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:连接方式,有inner、left、right、outer,默认为inner;
on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
left_on:左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;
right_on:右侧DataFrame中用于连接键的列名;
left_index:使用左侧DataFrame中的行索引作为连接键;
right_index:使用右侧DataFrame中的行索引作为连接键;
sort:默认为True,将合并的数据进行排序,设置为False可以提高性能;
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y');
copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能;
indicator:显示合并数据中数据的来源情况
举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# 1.默认以重叠的列名当做连接键。
df1 = DataFrame({ 'key' :[ 'a' , 'b' , 'b' ], 'data1' : range ( 3 )})
df2 = DataFrame({ 'key' :[ 'a' , 'b' , 'c' ], 'data2' : range ( 3 )})
pd.merge(df1,df2) #没有指定连接键,默认用重叠列名,没有指定连接方式
data1 key data2
0 0 a 0
1 1 b 1
2 2 b 1
# 2.默认做inner连接(取key的交集),连接方式还有(left,right,outer),制定连接方式加参数:how=''
pd.merge(df2,df1)
data2 key data1
0 0 a 0
1 1 b 1
2 1 b 2 #默认内连接,可以看见c没有连接上。
pd.merge(df2,df1,how = 'left' ) #通过how,指定连接方式
data2 key data1
0 0 a 0
1 1 b 1
2 1 b 2
3 2 c NaN
# 3.多键连接时将连接键组成列表传入,例:pd.merge(df1,df2,on=['key1','key2']
right = DataFrame({ 'key1' :[ 'foo' , 'foo' , 'bar' , 'bar' ],
'key2' :[ 'one' , 'one' , 'one' , 'two' ],
'lval' :[ 4 , 5 , 6 , 7 ]})
left = DataFrame({ 'key1' :[ 'foo' , 'foo' , 'bar' ],
'key2' :[ 'one' , 'two' , 'one' ],
'lval' :[ 1 , 2 , 3 ]})
right = DataFrame({ 'key1' :[ 'foo' , 'foo' , 'bar' , 'bar' ],
'key2' :[ 'one' , 'one' , 'one' , 'two' ],
'lval' :[ 4 , 5 , 6 , 7 ]})
pd.merge(left,right,on = [ 'key1' , 'key2' ],how = 'outer' ) #传出数组
key1 key2 lval_x lval_y
0 foo one 1 4
1 foo one 1 5
2 foo two 2 NaN
3 bar one 3 6
4 bar two NaN 7
# 4.如果两个对象的列名不同,可以分别指定,例:pd.merge(df1,df2,left_on='lkey',right_on='rkey')
df3 = DataFrame({ 'key3' :[ 'foo' , 'foo' , 'bar' , 'bar' ], #将上面的right的key 改了名字
'key4' :[ 'one' , 'one' , 'one' , 'two' ],
'lval' :[ 4 , 5 , 6 , 7 ]})
pd.merge(left,df3,left_on = 'key1' ,right_on = 'key3' ) #键名不同的连接
key1 key2 lval_x key3 key4 lval_y
0 foo one 1 foo one 4
1 foo one 1 foo one 5
2 foo two 2 foo one 4
3 foo two 2 foo one 5
4 bar one 3 bar one 6
5 bar one 3 bar two 7
|
三、join:主要用于索引上的合并
1
|
join( self , other, on = None , how = 'left' , lsuffix = ' ', rsuffix=' ',sort = False ):
|
其参数的意义与merge方法中的参数意义基本一样。
以上这篇在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/gdkyxy2013/article/details/80785361