Pandas の DataFrame をインデックスにマージ

  1. インデックス上の 2つの Pandas の DataFrame を結合するには merge() を使用する
  2. インデックス上の 2つの Pandas DataFrame を結合するには join() を使用する

データサイエンスや機械学習の世界では、さらなる分析のためにデータを整理、維持、クリーニングするための操作に精通していることが不可欠です。2つの DataFrames をマージするのは、そのような操作の一例です。Python の Pandas ライブラリを使えば、2つの DataFrames を結合するのは簡単です。

Pandas には、2つの DataFrame を結合するための merge() と、join() という 2つの便利な関数が用意されています。これらのメソッドはどちらも非常に似ていますが、merge() の方が汎用性が高く柔軟性が高いと考えられています。また、最終的な DataFrame の動作を変更するための多くのパラメータを提供します。join() は 2つの DataFrame をインデックス上で結合しますが、merge() は 2つの DataFrame を結合する際にキーとなるカラムを指定することができます。

これらの関数に共通するパラメータの 1つは how で、これは結合のタイプを定義します。デフォルトでは how パラメータは merge() の場合は inner で、join() の場合は left ですが、両方とも leftrightinnerouter に変更することができます。いずれも違いを知っておくことが肝心です。

2つの Pandas の DataFrame を結合するとき、一方を左の DataFrame、もう一方を右の DataFrame と仮定します。merge()join() はどちらもキーカラムのレコードにマッチします。inner 結合は、両方の DataFrame で一致するレコードの DataFrame を返します。outer 結合は、両方の DataFrame のすべての要素をマージした DataFrame を生成し、両側の欠落した値の NaN を埋めます。left 結合は、左の DataFrame のすべての要素を含みますが、右の DataFrame の一致したレコードのみを含みます。left の反対は right で、これは右の DataFrame のすべての要素を持ち、左の DataFrame の一致するレコードのみを持ちます。このことは、次のセクションのサンプルコードで、以下のコードで DataFrame を結合することでより明確になります。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

print(df1)
print(df2)

出力:

  C1
1  a
2  b
4  d
5  e
7  h
   C2
1  AA
2  BB
3  CC
5  EE
6  FF

インデックス上の 2つの Pandas の DataFrame を結合するには merge() を使用する

インデックス上の 2つの DataFrames を結合する場合、関数 merge() のパラメータ left_indexright_index の値は True でなければなりません。以下のコード例は、inner を結合型とする 2つの DataFrame を結合するものです。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_inner = df1.merge(df2, how='inner', left_index=True, right_index=True)

print(df_inner)

出力:

  C1  C2
1  a  AA
2  b  BB
5  e  EE

以下のコードは、結合型を outer とした 2つの DataFrames を結合します。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_outer = df1.merge(df2, how='outer', left_index=True, right_index=True)

print(df_outer)

出力:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

ご覧のように、結合タイプが inner の場合は両方の DataFrame から一致するレコードを持っていますが、outer の場合はすべての要素を持っていて、不足しているレコードを NaN で埋めています。ここで、left 結合を使ってみましょう。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_left = df1.merge(df2, how='left', left_index=True, right_index=True)

print(df_left)

出力:

  C1   C2
1  a   AA
2  b   BB
4  d  NaN
5  e   EE
7  h  NaN

上記のマージされた DataFrame には、左の DataFrame のすべての要素が含まれ、右の DataFrame の一致するレコードのみが含まれています。その正反対は、以下に示すように右結合です。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_right = df1.merge(df2, how='right', left_index=True, right_index=True)

print(df_right)

出力:

    C1  C2
1    a  AA
2    b  BB
3  NaN  CC
5    e  EE
6  NaN  FF

インデックス上の 2つの Pandas DataFrame を結合するには join() を使用する

join() メソッドは 2つの DataFrame のインデックスに基づいて結合し、デフォルトでは結合タイプは left です。これは常に右の DataFrame のインデックスを使用しますが、左の DataFrame のキーを指定することもできます。join() 関数の結合型は merge() と同様に指定することができます。

次の例は、outer 結合タイプでマージされた DataFrame を示しています。

import pandas as pd
import numpy as np
df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])
df_outer = df1.join(df2, how='outer')
print(df_outer)

出力:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

関連記事 - Pandas DataFrame

  • NumPy 配列を Pandas DataFrame に変換する
  • Pandas Dataframe のインデックスを列に変換する方法