pandas merge 和 concat
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
参考文档: