最近在做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。
这一部分就先到这里了,更多的用法还是要看官方文档。