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 |