はじめに
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メソッドは、異なる構造の複数のデータフレームを共通の列を元に結合するためのメソッドです。適切に使い分けることで、データフレームを効率的に結合することができます。