merge是按照列值或索引值进行连接,concat是按照轴进行拼接。
一,merge
数据库风格的连接是merge,
DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), indicator=False, validate=None)
参数注释:
right:右侧数据集
how:连接的类型,有效值是:{‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’},默认值是inner
用于指定连接的字段:
- on:用于连接的字段,该字段同时存在于左表和右表
- left_on、right_on:用于指定用于连接的字段
- left_index、right_index:用于指定用于连接的索引
sort:是否排序
suffixes:元组类型,用于为同名的字段设置后缀
indicator:如果设置为Ture,则在输出 DataFrame 中添加一个名为“_merge”的列,其中包含有关每行来源的信息;为该参数设置为一个字符串,用于为该列设置名称。该列的有效值是:left_only,right_only和both,分别表示只出现在左表,只出现在右表和两表同时存在。
validate:用于指定关系的类型,有效值是one_to_one,one_to_many,many_to_one和many_to_many
举个例子,有以下两个数据集,
df1 = pd.DataFrame({
'lkey': ['foo', 'bar', 'baz', 'foo'],
'value': [1, 2, 3, 5]})
df2 = pd.DataFrame({
'rkey': ['foo', 'bar', 'baz', 'foo'],
'value': [5, 6, 7, 8]})
df1
lkey value
0 foo 1
1 bar 2
2 baz 3
3 foo 5
df2
rkey value
0 foo 5
1 bar 6
2 baz 7
3 foo 8
df1是左表,右表是df2,两表进行inner join,结果如下所示:
df1.merge(df2, left_on='lkey', right_on='rkey')
lkey value_x rkey value_y
0 foo 1 foo 5
1 foo 1 foo 8
2 foo 5 foo 5
3 foo 5 foo 8
4 bar 2 bar 6
5 baz 3 baz 7
二,concat
沿特定轴连接DataFrame 或Series
pandas.concat(objs, axis=0, join='outer', ignore_index=False, verify_integrity=False, sort=False)
参数注释:
objs:用于concat的对象列表
axis:沿着哪一个轴,0代表列,1代表行。
join:如何处理其他轴上的索引,有效值是inner和outer,默认值是outer
ignore_index:如果设置为True,那么返回的结果使用默认的索引,即从0到n-1,默认值是False,不忽略原始索引。
创建多级索引(MultiIndex)
- keys:作为多级索引最外层的索引值
- levels:如果设置keys参数,那么levels用于指定多级索引的各个级别
- names:如果设置keys参数,那么names用于指定多级索引各个级别的名称
verify_integrity:用于检查结果集的索引是否有重复
举个例子,两个序列进行拼接,不忽略原始索引。
s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])
pd.concat([s1, s2])
0 a
1 b
0 c
1 d
dtype: object
如果忽略原始索引,那么结果集会生成一个从0到n-1的默认索引:
pd.concat([s1, s2], ignore_index=True)
0 a
1 b
2 c
3 d
dtype: object
在拼接序列时,使用keys参数创建多级索引最外层的一个索引:
pd.concat([s1, s2], keys=['s1', 's2'])
s1 0 a
1 b
s2 0 c
1 d
dtype: object
参考文档: