concat、append、merge、join、combine_first

concat、append、merge、join、combine_first

数据合并中,通常都会用到以上的几个函数,譬如,在titanic项目中,要合并train_df, test_ df,可以是这样

train_df=pd.read_csv("E:/python/titanic/train.csv")
test_df=pd.read_csv("E:/python/titanic/test.csv")
df=pd.concat([train_df,test_df])
print(type(df))
<class 'pandas.core.frame.DataFrame'>

也可以是这样

full=train_df.append(test_df,ignore_index=True)
print(type(full))
<class 'pandas.core.frame.DataFrame'>

以上的这些函数,他们之间又有什么异同呢?


一、Concat: 合并多个数组

简单的合并可以通过Pandas中的concat函数来实现的。

帐号登录

concat 可横向按行合并,可纵向按列合并

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
          keys=None, levels=None, names=None, verify_integrity=False,
          copy=True)

obs: 带合并的对象集合,可以是Series,DataFrame

axis: {0,1....}合并方向,默认为0,表示纵向,1表示横向;

join: {inner,outer}:合并方式,默认为outer,表示并集;inner表示交集;

join_axes: 按哪些对象的索引保存;

ignore _ i ndex :{False,True},是否忽略原 index,默认为不忽略

keys: 为原始dataframe添加一个键,默认为无

1、  result=pd.concat(frames)

代码示例:

eg:列相连,索引保持原状
>>> s1 = pd.Series(['a', 'b'])
>>> s2 = pd.Series(['c', 'd'])
>>> pd.concat([s1, s2])    
0    a
1    b
0    c
1    d
dtype: object
>>> pd.concat([s1, s2], ignore_index=True) #重新建立索引
0    a
1    b
2    c
3    d
dtype: object


2、  result = pd.concat(frames, keys=['x', 'y', 'z'])  

代码示例:

>>> pd.concat([s1, s2], keys=['s1', 's2',])  #增加新的keys
s1  0    a
    1    b
s2  0    c
    1    d
dtype: object
>>> pd.concat([s1, s2], keys=['s1', 's2'],
...           names=['Series name', 'Row ID'])   #新增列名
Series name  Row ID
s1           0         a
             1         b
s2           0         c
             1         d
dtype: object


result.ix['y']
Out[7]: 
    A   B   C   D
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7


3、 result=pd.concat([df1, df2],axis=1)  
#横向链接(按照index连接),这里是把所有的元素联接接在一起:
>>> df1 = pd.DataFrame([['a', 1], ['b', 2]],
...                    columns=['letter', 'number'])
  letter  number
0      a       1
1      b       2
>>> df2 = pd.DataFrame([['c', 3], ['d', 4]],
...                    columns=['letter', 'number'])  #注意这里是列名
  letter  number
0      c       3
1      d       4
>>> pd.concat([df1, df2])
  letter  number
0      a       1
1      b       2
0      c       3
1      d       4
>>> df3 = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog']],
...                    columns=['letter', 'number', 'animal']) #按列名合并
  letter  number animal
0      c       3    cat
1      d       4    dog
>>> pd.concat([df1, df3])
  animal letter  number
0    NaN      a       1
1    NaN      b       2
0    cat      c       3
1    dog      d       4
>>>dfa = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog'],['w', 8, 'pig']],
...                    columns=['letter', 'number', 'animal']) #按列名合并
	letter	number	animal
0	c	3	cat
1	d	4	dog
2	w	8	pig
>>>pd.concat([df1,dfa])
	animal	letter	number
0	NaN	a	1
1	NaN	b	2
0	cat	c	3
1	dog	d	4
2	pig	w	8
>>>pd.concat([df1,dfa],ignore_index=True)
animal	letter	number
0	NaN	a	1
1	NaN	b	2
2	cat	c	3
3	dog	d	4
4	pig	w	8


axis=1,按照索引来合并        
5、result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
>>> df4 = pd.DataFrame([['bird', 'polly'], ['monkey', 'george']],
                      columns=['animal', 'name'])
	animal	name
0	bird	polly
1	monkey	george
  letter  number
0      a       1
1      b       2
>>> pd.concat([df1, df4], axis=1)
  letter  number  animal    name
0      a       1    bird   polly
1      b       2  monkey  george


6.result = pd.concat([df1, s1], axis=1)
 7.result = pd.concat([df1, s2, s2, s2], axis=1)
8.result = pd.concat([df1, s1], axis=1, ignore_index=True)

二、append:附加;贴上

横向和纵向同时扩充,不考虑columns和index

1、向数据框添加序列
In [1]: s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
In [2]: result = df1.append(s2, ignore_index=True)

# 此刻你需要使用ignore_index,丢弃DataFrame的索引;如果你还想保存该索引,
则应该构造一个适当的DataFrame,并追加这些对象。

2、向数据框添加字典
result = df1.append(dicts, ignore_index=True)
3、向数据框添加数据框
3.1 result = df1.append(df2)
>>> df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
0  1  2
1  3  4
>>> df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
>>> df.append(df2)
0  1  2
1  3  4
0  5  6
1  7  8
3.2、result= df1.append(df4)
3.3 可同时添加两个数据框
result = df1.append([df2, df3])
3.4 添加数据框以后重新排列索引
result = df1.append(df4, ignore_index=True)


三、merge

merge 函数通过一个或多个键来将数据集的行连接起来。该函数的应用场景是针对同一个主键存在两张包含不同特征的表,通过该主键的链接,将两张表进行合并。合并之后,两张表的行数没有增加,列数是两张表的列数之和减一。

pd.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_on,right_on

on=None: 指定连接的列名,若两列希望连接的列名不一样,可以通过left_on和right_on 来具体指定,不指定时pandas会自动找到相同名字的列

how=’inner’,参数指的是左右两个表主键那一列中存在不重合的行时,取结果的方式:inner表示交集,outer 表示并集,left 和right 表示取某一边。

1、

2. result = pd.merge(left, right, on='key')
3、通过indicator表明merge的方式
4.多条件合并
 result = pd.merge(left, right, on=['key1', 'key2'])
 result = pd.merge(left, right, how='left', on=['key1', 'key2'])


 result = pd.merge(left, right, how='right', on=['key1', 'key2'])
5、result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
6、result = pd.merge(left, right, how='inner', on=['key1', 'key2'])
7、多数据集合并
是针对合并后的数据再合并,不是一次性合并几个数据集
df1=pd.DataFrame({'key':['a','b','c','d','e'],'data1':np.arange(5)})
df2=pd.DataFrame({'key':['a','b','c'],'data2':np.arange(3)})
df3=pd.DataFrame({'key':['a','b','c','d'],'data3':np.arange(4)})
data=pd.merge(pd.merge(df1,df2,on='key',how='left'),df3,on='key',how='left')
In [55]: data
Out[55]: 
   data1 key  data2  data3
0      0   a    0.0    0.0
1      1   b    1.0    1.0
2      2   c    2.0    2.0
3      3   d    NaN    3.0
4      4   e    NaN    NaN

四、join

In [1]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                              'B': ['B0', 'B1', 'B2']},
                               index=['K0', 'K1', 'K2'])
In [2]: right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                               'D': ['D0', 'D2', 'D3']},
                                index=['K0', 'K2', 'K3'])      
In [3]: result = left.join(right)
In [4]: result = left.join(right, how='outer')
#这与merge的以下用法相似
result = pd.merge(left, right, left_index=True, right_index=True, how='outer')
result = left.join(right, how='inner')
#这与merge的以下用法相似
result = pd.merge(left, right, left_index=True, right_index=True, how='inner');
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

四、combine

若df1的数据缺失,则用df2的数据值填充df1的数据值

df1 = pd.DataFrame([[1, np.nan]])
df2 = pd.DataFrame([[3, 4]])
0	1	NaN
0	3	4
df1.combine_first(df2)
0	1	4.0


a=pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index=['f','e','d','c','b','a'])
b=pd.Series([1,np.nan,3,4,5,np.nan],index=['f','e','d','c','b','a'])
print(a)
print(b)
f    NaN
e    2.5
d    NaN
c    3.5
b    4.5
a    NaN
dtype: float64
f    1.0
e    NaN
d    3.0
c    4.0
b    5.0
a    NaN
dtype: float64
b.combine_first(a)
f    1.0