
はじめに
PandasはPythonのデータ解析ライブラリで、データフレームの結合には、concatとmergeの2つのメソッドが用意されています。この記事では、concatとmergeの使い分けと、それぞれのオプション、実践例、テクニックについて解説します。
Pandasでデータフレームを結合する方法とconcatとmergeの違いの概要
データフレームを結合する方法には、concatとmergeがあります。2つのメソッドの違いは、concatはインデックスや列のラベルを基準にデータフレームを縦方向(行方向)または横方向(列方向)に結合する方法で、mergeは共通の列(キー)を基準にデータフレームを結合する方法です。
つまり、concatは2つ以上のデータフレームを結合する際に使用し、mergeは共通のキーを持つデータフレームを結合する際に使用します。
concatの使い方:データフレームを縦方向・横方向に結合する方法とオプションの説明
concatは、データフレームを縦方向(行方向)または横方向(列方向)に結合する方法があります。
データフレームを縦方向に結合する方法
データフレームを縦方向に結合するには、concatメソッドを使用します。以下は、concatメソッドを使用して、3つのデータフレームを縦方向に結合する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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) |
出力結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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引数を使用して、結合前のデータフレームを識別する例です。
1 2 | result = pd.concat(frames, keys = [ 'df1' , 'df2' , 'df3' ]) print (result) |
出力結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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つのデータフレームを横方向に結合する例です。
1 2 3 4 5 6 7 8 | 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) |
出力結果:
1 2 3 4 5 | 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引数を使用して、結合方法を指定する例です。
1 2 | result3 = pd.concat(frames2, axis = 1 , join = 'inner' ) print (result3) |
出力結果:
1 2 3 4 5 | 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つのデータフレームを結合する例です。
1 2 3 4 5 6 7 8 9 | 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) |
出力結果:
1 2 3 4 | 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データフレームを外部結合する例です。
1 2 | result5 = pd.merge(left, right, on = 'key' , how = 'outer' ) print (result5) |
出力結果:
1 2 3 4 5 6 | 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を使用して、複数のデータソースを結合する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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) |
出力結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
1 2 | 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メソッドは、異なる構造の複数のデータフレームを共通の列を元に結合するためのメソッドです。適切に使い分けることで、データフレームを効率的に結合することができます。