In [4]: import pandas as pd
In [5]: import numpy as np
In [6]: df1=DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])
In [7]: df2=DataFrame(np.random.randn(2,3),columns=['b','d','a'])
In [8]: df1
Out[8]:
a b c d
0 -0.278649 -0.909574 0.736608 -0.813353
1 0.644753 -0.469741 0.593455 1.432505
2 1.024692 -1.316237 0.903557 0.170960
In [9]: df2
Out[9]:
b d a
0 -0.956196 -2.253606 -0.777591
1 -0.532908 0.428463 0.702811
concat 默认axis=0 join='outer'
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
In [10]: pd.concat([df1, df2])
Out[10]:
a b c d
0 -0.278649 -0.909574 0.736608 -0.813353
1 0.644753 -0.469741 0.593455 1.432505
2 1.024692 -1.316237 0.903557 0.170960
0 -0.777591 -0.956196 NaN -2.253606
1 0.702811 -0.532908 NaN 0.428463
In [11]: pd.concat([df1, df2], axis=1)
Out[11]:
a b c d b d a
0 -0.278649 -0.909574 0.736608 -0.813353 -0.956196 -2.253606 -0.777591
1 0.644753 -0.469741 0.593455 1.432505 -0.532908 0.428463 0.702811
2 1.024692 -1.316237 0.903557 0.170960 NaN NaN NaN
In [12]: pd.concat([df1, df2], join='inner')
Out[12]:
a b d
0 -0.278649 -0.909574 -0.813353
1 0.644753 -0.469741 1.432505
2 1.024692 -1.316237 0.170960
0 -0.777591 -0.956196 -2.253606
1 0.702811 -0.532908 0.428463
In [13]: pd.concat([df1, df2], axis=1, join='inner')
Out[13]:
a b c d b d a
0 -0.278649 -0.909574 0.736608 -0.813353 -0.956196 -2.253606 -0.777591
1 0.644753 -0.469741 0.593455 1.432505 -0.532908 0.428463 0.702811
由此看出,concat就是把两个表堆叠在一起,或横向或纵向。
outer 为直接合并,不去管重复的索引。
inner 根据指定轴(axis),只保留交集的索引。
当axis=0时:pd.concat([df1, df2])
与 df1.append(df2)
返回的结果是一样的。
当axis=1时:pd.concat([df1, df2], axis=1)
与 pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
的返回结果一样。
merge:通过键拼接列
类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。
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:显示合并数据中数据的来源情况
In [27]: df1=DataFrame({'key':['a','b','b'],'data1':range(3)})
In [28]: df2=DataFrame({'key':['a','b','c'],'data2':range(3)})
In [29]: df1
Out[29]:
key data1
0 a 0
1 b 1
2 b 2
In [30]: df2
Out[30]:
key data2
0 a 0
1 b 1
2 c 2
In [31]: pd.merge(df1, df2)
Out[31]:
key data1 data2
0 a 0 0
1 b 1 1
2 b 2 1
In [32]: pd.merge(df2,df1)
Out[32]:
key data2 data1
0 a 0 0
1 b 1 1
2 b 1 2
默认取 key 的交集
In [33]: pd.merge(df2,df1,how='left')
Out[33]:
key data2 data1
0 a 0 0.0
1 b 1 1.0
2 b 1 2.0
3 c 2 NaN
指定做连接,以左边的 key 为主
join:主要用于索引上的合并
join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False)
提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame.
join方法默认为左外连接 how=left
In [38]: df1=DataFrame([{"id":0,"name":'lxh',"age":20,"cp":'lm'},{"id":1,"name":'xiao',"age":40,"cp":'ly'},{"id":2,"name":'hua',"age":4,"cp":'yry'},{"id":3,"name"
...: :'be',"age":70,"cp":'old'}],index=['a','b','c','d'])
In [39]: df1
Out[39]:
id name age cp
a 0 lxh 20 lm
b 1 xiao 40 ly
c 2 hua 4 yry
d 3 be 70 old
In [41]: df2=DataFrame([{"sex":0},{"sex":1},{"sex":2}],index=['a','b','e'])
In [43]: df2
Out[43]:
sex
a 0
b 1
e 2
In [44]: df1.join(df2)
Out[44]:
id name age cp sex
a 0 lxh 20 lm 0.0
b 1 xiao 40 ly 1.0
c 2 hua 4 yry NaN
d 3 be 70 old NaN
In [46]: df1.join(df2, how='right')
Out[46]:
id name age cp sex
a 0.0 lxh 20.0 lm 0
b 1.0 xiao 40.0 ly 1
e NaN NaN NaN NaN 2
In [47]: df1.join(df2, how='inner')
Out[47]:
id name age cp sex
a 0 lxh 20 lm 0
b 1 xiao 40 ly 1
In [48]: df1.join(df2, how='outer')
Out[48]:
id name age cp sex
a 0.0 lxh 20.0 lm 0.0
b 1.0 xiao 40.0 ly 1.0
c 2.0 hua 4.0 yry NaN
d 3.0 be 70.0 old NaN
e NaN NaN NaN NaN 2.0
可以看出 join 是对索引的合并