最近在做Information Science的时候用到了concat和 merge,整理一下好了。
concat和merge
- concat
- merge
concat
当我用到concat的时候,我一般都是只想把两个dataframe连接起来,想法十分的简单,就是单纯的在连接,或者说拼接。官方网站上也有说可以去关联,但是出于习惯,我一般都直接用merge。
下面展示一些 内联代码片
。
这是官方指南上的例子,说的是如何拼接两个series,dataframe也是相同的操作。讲了一下参数设置的含义。
>>> s1 = pd.Series(['a', 'b'])
>>> s2 = pd.Series(['c', 'd'])
>>> pd.concat([s1, s2])
0 a
1 b
0 c
1 d
dtype: object
忽略index
>>> pd.concat([s1, s2], ignore_index=True)
0 a
1 b
2 c
3 d
dtype: object
在这里,我就不重复官网上的操作了,我只强调一下我最常用的参数 axis。axis表示的是轴的方向,在python里出场频率之高,让人叹为观止,几乎处处能用到。方便的是,它通用。当你不设置的时候,它默认是沿着index的方向,也就是axis=0.
axis=1
>>> df1 = pd.DataFrame([['a', 1], ['b', 2]],
... columns=['letter', 'number'])
>>> df1
letter number
0 a 1
1 b 2
>>> df2 = pd.DataFrame([['c', 3], ['d', 4]],
... columns=['letter', 'number'])
>>> df2
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
>>> df4 = pd.DataFrame([['bird', 'polly'], ['monkey', 'george']],
... columns=['animal', 'name'])
>>> pd.concat([df1, df4], axis=1)
letter number animal name
0 a 1 bird polly
1 b 2 monkey george
在我使用concat的时候,我觉得两个点是我要强调的。
第一个是要拼接的dataframe或者series要用中括号括起来。
第二个是要注意拼接的方向。
这两个弄明白,这个函数就可以调用了,其他的参数就看个人喜好了。
merge
我喜欢用merge的原因是它非常像sql的join功能,虽然pandas本身也有join,但是我习惯了merge,所以就只说merge了。
官网上的例子
>>> 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
用法是这样的,left_on是df1的关联的列名,right_on是df2的关联的列名,可以有多个列共同作用,当然就要放在list里,按照对应顺序。
这里我建议加一个参数 how
inner是取交集,
left 是left join 也就是以df1为主表
right 是right join 以df2为主表
outer 是full out join
文档里关于这段的英文描述,我觉得写的很好
left: use only keys from left frame, similar to a SQL left outer join; preserve key order.
right: use only keys from right frame, similar to a SQL right outer join; preserve key order.
outer: use union of keys from both frames, similar to a SQL full outer join; sort keys lexicographically.
inner: use intersection of keys from both frames, similar to a SQL inner join; preserve the order of the left keys.
>>> 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
之前,我的小同学ZH 问我看文档的时候是喜欢看中文的还是英文的。当时我说感觉差不多,最近讲实话,我觉得英文更有体会一些。这个东西的感觉就非常的微妙,仿佛同样的话英文看起来更接近原意。在用这两个函数的时候,或者也可以加上join。我的脑海记忆的方式是,当我需要简单的拼接,我就用concat,当我需要像sql一样的处理,我就用merge。
这一部分就先到这里了,更多的用法还是要看官方文档。