Pandas の DataFrame をインデックスにマージ
-
インデックス上の 2つの Pandas の DataFrame を結合するには
merge()
を使用する -
インデックス上の 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
ですが、両方とも left
、right
、inner
、outer
に変更することができます。いずれも違いを知っておくことが肝心です。
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_index
と right_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
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn