pandasのconcat関数では、ラベルが付いた軸に沿った配列の連結をおこなう。

今回は多くの例を紹介しながら、concat関数の動作を確認していく。

基本の連結

まずは、インデックスに重複の無い3つのシリーズを連結する例だ。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import pandas as pd
 
s1 = pd.Series([0, 1], index=['a', 'b'])
s2 = pd.Series([2, 3, 4], index=['c', 'd', 'e'])
s3 = pd.Series([5, 6], index=['f', 'g'])
 
pd.concat([s1, s2, s3])
# a    0
# b    1
# c    2
# d    3
# e    4
# f    5
# g    6
# dtype: int64

concat関数の引数にオブジェクトを格納したリストを与えると、与えられたオブジェクト(この場合シリーズ)が連結される。

また、デフォルトでは行方向へ連結されるが、以下のように列方向へ連結することも可能だ。

1
2
3
4
5
6
7
8
9
df = pd.concat([s1, s2, s3], axis=1)
#      0    1    2
# a  0.0  NaN  NaN
# b  1.0  NaN  NaN
# c  NaN  2.0  NaN
# d  NaN  3.0  NaN
# e  NaN  4.0  NaN
# f  NaN  NaN  5.0
# g  NaN  NaN  6.0

内部結合による連結

先ほどの例ではラベルに重複がなく、結合された結果を見ると外部結合であることが分かった。

内部結合をおこなう場合は、joinオプションにより別途指定する必要がある。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
 
s1 = pd.Series([0, 1], index=['a', 'b'])
s2 = pd.Series([2, 3, 4], index=['c', 'd', 'e'])
s3 = pd.Series([5, 6], index=['f', 'g'])
 
s4 = pd.concat([s1, s3])
# a    0
# b    1
# f    5
# g    6
# dtype: int64
 
df_outer = pd.concat([s1, s4], axis=1)
#      0  1
# a  0.0  0
# b  1.0  1
# f  NaN  5
# g  NaN  6
 
df_inner = pd.concat([s1, s4], axis=1, join='inner')
#    0  1
# a  0  0
# b  1  1

連結する軸を指定する

join_axesオプションを使うことで、連結する軸を任意で指定することも可能だ。

1
2
3
4
5
df = pd.concat([s1, s4], axis=1, join_axes=[['a', 'b', 'e']])
#      0    1
# a  0.0  0.0
# b  1.0  1.0
# e  NaN  NaN

連結したオブジェクトに階層型インデックスを持たせる

単純な連結操作では、連結後のオブジェクトの要素が、連結前のどの要素に対応しているかが分からなくなることがある。

そういった場合は、連結後のオブジェクトに階層型インデックスを持たせると良い。

concat関数のkeysオプションを設定すれば、階層型インデックスを持たせることができ、以下のような結果となる。

1
2
3
4
5
6
7
8
df_h = pd.concat([s1, s1, s3], keys=['one', 'two', 'three'])
# one    a    0
#        b    1
# two    a    0
#        b    1
# three  f    5
#        g    6
# dtype: int64

axis=1と列方向へ連結する場合は、keysに指定した値が列名として設定される。

1
2
3
4
5
6
7
8
9
df_h = pd.concat([s1, s2, s3], axis=1, keys=['one', 'two', 'three'])
#    one  two  three
# a  0.0  NaN    NaN
# b  1.0  NaN    NaN
# c  NaN  2.0    NaN
# d  NaN  3.0    NaN
# e  NaN  4.0    NaN
# f  NaN  NaN    5.0
# g  NaN  NaN    6.0

データフレームの結合の場合

シリーズがデータフレームになってもconcat関数の使い方は変わりない。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
import numpy as np
 
df1 = pd.DataFrame(np.arange(6).reshape(3, 2),
                  index=['a', 'b', 'c'],
                  columns=['one', 'two'])
#    one  two
# a    0    1
# b    2    3
# c    4    5
 
df2 = pd.DataFrame(5 + np.arange(4).reshape(2, 2),
                  index=['a', 'c'],
                  columns=['three', 'four'])
#    three  four
# a      5     6
# c      7     8
 
pd.concat([df1, df2], axis=1, keys=['level1', 'level2'])
#   level1     level2    
#      one two  three four
# a      0   1    5.0  6.0
# b      2   3    NaN  NaN
# c      4   5    7.0  8.0

なお、上記のkeysによる階層型インデックスを持たせた結合は、以下のようにconcat関数にディクショナリを渡すことでも同様の結果が得られる。

1
2
3
4
5
6
pd.concat({'level1': df1, 'level2': df2}, axis=1)
#   level1     level2    
#      one two  three four
# a      0   1    5.0  6.0
# b      2   3    NaN  NaN
# c      4   5    7.0  8.0