Pandasでデータフレームを結合!concatとmergeの使い分けとテクニック

はじめに

PandasはPythonのデータ解析ライブラリで、データフレームの結合には、concatとmergeの2つのメソッドが用意されています。この記事では、concatとmergeの使い分けと、それぞれのオプション、実践例、テクニックについて解説します。

Pandasでデータフレームを結合する方法とconcatとmergeの違いの概要

データフレームを結合する方法には、concatとmergeがあります。2つのメソッドの違いは、concatはインデックスや列のラベルを基準にデータフレームを縦方向(行方向)または横方向(列方向)に結合する方法で、mergeは共通の列(キー)を基準にデータフレームを結合する方法です。

つまり、concatは2つ以上のデータフレームを結合する際に使用し、mergeは共通のキーを持つデータフレームを結合する際に使用します。

concatの使い方:データフレームを縦方向・横方向に結合する方法とオプションの説明

concatは、データフレームを縦方向(行方向)または横方向(列方向)に結合する方法があります。

データフレームを縦方向に結合する方法

データフレームを縦方向に結合するには、concatメソッドを使用します。以下は、concatメソッドを使用して、3つのデータフレームを縦方向に結合する例です。

import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']})
frames = [df1, df2, df3]
result = pd.concat(frames)

print(result)

出力結果:

     A    B    C    D
0   A0   B0   C0   D0
1   A1   B1   C1   D1
2   A2   B2   C2   D2
3   A3   B3   C3   D3
0   A4   B4   C4   D4
1   A5   B5   C5   D5
2   A6   B6   C6   D6
3   A7   B7   C7   D7
0   A8   B8   C8   D8
1   A9   B9   C9   D9
2  A10  B10  C10  D10
3  A11  B11  C11  D11

縦方向に結合する場合、オプションとしてkeys引数を指定することができます。これにより、元のデータフレームを区別するために、新しい階層的なインデックスが作成されます。以下は、keys引数を使用して、結合前のデータフレームを識別する例です。

result = pd.concat(frames, keys=['df1', 'df2', 'df3'])
print(result)

出力結果:

         A    B    C    D
df1 0   A0   B0   C0   D0
    1   A1   B1   C1   D1
    2   A2   B2   C2   D2
    3   A3   B3   C3   D3
df2 0   A4   B4   C4   D4
    1   A5   B5   C5   D5
    2   A6   B6   C6   D6
    3   A7   B7   C7   D7
df3 0   A8   B8   C8   D8
    1   A9   B9   C9   D9
    2  A10  B10  C10  D10
    3  A11  B11  C11  D11

データフレームを横方向に結合する方法

データフレームを横方向に結合するには、concatメソッドを使用します。以下は、concatメソッドを使用して、2つのデータフレームを横方向に結合する例です。

df4 = pd.DataFrame({'E': ['E0', 'E1', 'E2', 'E3'],
                    'F': ['F0', 'F1', 'F2', 'F3'],
                    'G': ['G0', 'G1', 'G2', 'G3'],
                    'H': ['H0', 'H1', 'H2', 'H3']})
frames2 = [df1, df4]
result2 = pd.concat(frames2, axis=1)

print(result2)

出力結果:

    A   B   C   D   E   F   G   H
0  A0  B0  C0  D0  E0  F0  G0  H0
1  A1  B1  C1  D1  E1  F1  G1  H1
2  A2  B2  C2  D2  E2  F2  G2  H2
3  A3  B3  C3  D3  E3  F3  G3  H3

横方向に結合する場合、オプションとしてjoin引数を指定することができます。これにより、元のデータフレームに存在する列に対して、inner、outer、left、rightの4つの結合方法から選択することができます。以下は、join引数を使用して、結合方法を指定する例です。

result3 = pd.concat(frames2, axis=1, join='inner')
print(result3)

出力結果:

    A   B   C   D   E   F   G   H
0  A0  B0  C0  D0  E0  F0  G0  H0
1  A1  B1  C1  D1  E1  F1  G1  H1
2  A2  B2  C2  D2  E2  F2  G2  H2
3  A3  B3  C3  D3  E3  F3  G3  H3

mergeの使い方:データフレームをキーを元に結合する方法とオプションの説明

mergeは、2つ以上のデータフレームを共通の列(キー)を基準に結合する方法です。以下は、
# mergeメソッドを使用して、2つのデータフレームを結合する例です。

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K4'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                       'D': ['D0', 'D1', 'D2', 'D3']})

result4 = pd.merge(left, right, on='key')
print(result4)

出力結果:

  key  A   B  C  D
0  K0  A0 B0 C0 D0
1  K1  A1 B1 C1 D1
2  K2  A2 B2 C2 D2

結合する場合、on引数で共通のキーを指定します。キーが複数ある場合は、on引数にリストを渡すことができます。

mergeには、how引数を指定して、結合方法を指定することができます。以下は、how引数にouterを指定して、leftデータフレームとrightデータフレームを外部結合する例です。

result5 = pd.merge(left, right, on='key', how='outer')
print(result5)

出力結果:

  key   A   B   C   D
0  K0  A0  B0  C0  D0
1  K1  A1  B1  C1  D1
2  K2  A2  B2  C2  D2
3  K3  A3  B3 NaN NaN
4  K4 NaN NaN  C3  D3

上記の例では、leftデータフレームに存在しないkeyを持つrightデータフレームの行も結合されます。

concatとmergeの使い分け:両者の適用シーンの違いを明確にする比較表

concat merge
結合するデータフレームの構造 同じ構造 異なる構造
結合するキー 不要 必要
結合方法 縦方向・横方向 内部結合・外部結合・左外部結合・右外部結合
出力形式 データフレーム データフレーム
適用シーン 同じ構造の複数のデータフレームを結合する場合 異なる構造の複数のデータフレームを結合する場合

実践例:concatとmergeを使ったデータフレーム結合の実例とコードサンプル

以下は、concatとmergeを使用して、複数のデータソースを結合する例です。

df_a = pd.DataFrame({'id': [1, 2, 3, 4, 5],
                      'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
                      'age': [24, 28, 22, 25, 30]})
df_b = pd.DataFrame({'id': [3, 4, 5, 6, 7],
                      'gender': ['female', 'male', 'female', 'male', 'male'],
                      'salary': [50000, 70000, 60000, 80000, 90000]})
df_c = pd.DataFrame({'id': [5, 6, 7, 8, 9],
                      'location': ['Tokyo', 'Osaka', 'Kyoto', 'Sapporo', 'Fukuoka'],
                      'hobby': ['reading', 'music', 'sports', 'cooking', 'travel']})

# concatで結合
frames = [df_a, df_b, df_c]
result = pd.concat(frames, sort=False)
print(result)

# mergeで結合
df_ab = pd.merge(df_a, df_b, on='id')
df_abc = pd.merge(df_ab, df_c, on='id')
print(df_abc)

出力結果:

   id     name   age  gender   salary location    hobby
0   1    Alice  24.0     NaN      NaN      NaN      NaN
1   2      Bob  28.0     NaN      NaN      NaN      NaN
2   3  Charlie  22.0     NaN      NaN      NaN      NaN
3   4    David  25.0     NaN      NaN      NaN      NaN
4   5    Emily  30.0     NaN      NaN      NaN      NaN
0   3      NaN   NaN  female  50000.0      NaN      NaN
1   4      NaN   NaN    male  70000.0      NaN      NaN
2   5      NaN   NaN  female  60000.0      NaN      NaN
3   6      NaN   NaN    male  80000.0      NaN      NaN
4   7      NaN   NaN    male  90000.0      NaN      NaN
0   5      NaN   NaN     NaN      NaN    Tokyo  reading
1   6      NaN   NaN     NaN      NaN    Osaka    music
2   7      NaN   NaN     NaN      NaN    Kyoto   sports
3   8      NaN   NaN     NaN      NaN  Sapporo  cooking
4   9      NaN   NaN     NaN      NaN  Fukuoka   travel

   id   name  age  gender  salary location    hobby
0   5  Emily   30  female   60000    Tokyo  reading

mergeで結合する場合、3つのデータフレームを順に結合しています。各データフレームに共通の列idがあるため、mergeを使用して結合することができます。また、mergeでは、内部結合を行っているため、結合後のデータフレームには共通のidが存在する行だけが含まれます。

Pandasでデータフレームを結合する際のconcatとmergeの使い分けとテクニック

concatとmergeは、それぞれ異なる結合方法を持つため、適切に使い分けることが重要です。以下は、concatとmergeの使い分けと、便利なテクニックをまとめたものです。

    • concatは、同じ構造の複数のデータフレームを縦方向・横方向に結合する場合に使用する。
      • mergeは、異なる構造の複数のデータフレームを共通の列を元に結合する場合に使用する。
      • concatで縦方向に結合する場合、オプションのaxis引数を0に設定する。
      • concatで横方向に結合する場合、オプションのaxis引数を1に設定する。
      • concatで結合する場合、sort引数をFalseにすることで、結合後のデータフレームの列の順序を保持することができる。
      • mergeで結合する場合、共通の列がある場合はon引数にその列名を指定する。複数の列が共通の場合は、on引数に列名のリストを渡す。
      • mergeで結合する場合、結合方法はhow引数で指定する。内部結合はinner、外部結合はouter、左外部結合はleft、右外部結合はrightを指定する。

        まとめ

        Pandasは、データフレームを結合するための便利なメソッドを提供しています。concatメソッドは、同じ構造の複数のデータフレームを縦方向・横方向に結合するためのメソッドであり、mergeメソッドは、異なる構造の複数のデータフレームを共通の列を元に結合するためのメソッドです。適切に使い分けることで、データフレームを効率的に結合することができます。