
はじめに
データ分析において、複数のデータフレームを結合することはよく行われます。pandasライブラリは、縦方向・横方向のデータフレームの結合を行うためのconcat関数、キーによる結合を行うためのmerge関数、およびインデックスに基づく結合を行うためのjoin関数を提供しています。
この記事では、pandasライブラリを使って、データフレームを合成する方法を紹介します。具体的には、concat関数を使った縦方向の合成、横方向の合成、merge関数を使ったデータフレームの結合、およびjoin関数を使ったデータフレームの合成について解説します。さらに、データフレーム合成時の注意点についても触れます。
concat関数を使った縦方向の合成: 基本的な使い方と実例
concat関数を使うと、複数のデータフレームを縦方向に連結することができます。基本的な使い方は、以下のようになります。
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' ]}) # データフレームの連結 result = pd.concat([df1, df2, df3]) print (result) |
この場合、df1、df2、df3の3つのデータフレームを縦方向に連結したデータフレームがresultに格納されます。連結する際には、引数に連結するデータフレームをリストで渡します。
次に、実際にデータフレームを連結する例を紹介します。
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' ]}) # データフレームの連結 result = pd.concat([df1, df2, df3]) print (result.head()) |
実行結果は以下のようになります。
1 2 3 4 5 6 | 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 |
連結したデータフレームには、元のデータフレームの行番号がそのまま残っていることがわかります。これは、引数にignore_index=Trueを指定することで変更することができます。
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' : [ 'A4' , 'A5' , 'A6' , 'A7' ], 'B' : [ 'B4' , 'B5' , 'B6' , 'B7' ], 'C' : [ 'C4' , 'C5' , 'C6' , 'C7' ], 'D' : [ 'D4' , 'D5' , 'D6' , 'D7' ]}) # データフレームの連結 result = pd.concat([df1, df2, df3], ignore_index = True ) print (result.head()) |
実行結果は以下のようになります。
1 2 3 4 5 6 | A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A4 B4 C4 D4 |
ignore_index=Trueを指定することで、行番号が連番に変更されたことがわかります。
concat関数を使った横方向の合成: オプションの設定方法と実例
concat関数を使うと、複数のデータフレームを横方向に連結することもできます。オプションによって、どのように連結するかを制御することができます。
以下は、基本的な使い方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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({ 'E' : [ 'E0' , 'E1' , 'E2' , 'E3' ], 'F' : [ 'F0' , 'F1' , 'F2' , 'F3' ], 'G' : [ 'G0' , 'G1' , 'G2' , 'G3' ], 'H' : [ 'H0' , 'H1' , 'H2' , 'H3' ]}) # データフレームの連結 result = pd.concat([df1, df2], axis = 1 ) print (result.head()) |
この場合、df1とdf2の2つのデータフレームを横方向に連結したデータフレームがresultに格納されます。連結する際には、引数に連結するデータフレームをリストで渡します。また、連結方向を制御するために、axis=1を指定します。
次に、実際にデータフレームを連結する例を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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({ 'E' : [ 'E0' , 'E1' , 'E2' , 'E3' ], 'F' : [ 'F0' , 'F1' , 'F2' , 'F3' ], 'G' : [ 'G0' , 'G1' , 'G2' , 'G3' ], 'H' : [ 'H0' , 'H1' , 'H2' , 'H3' ]}) # データフレームの連結 result = pd.concat([df1, df2], axis = 1 ) print (result.head()) |
実行結果は以下のようになります。
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 |
連結したデータフレームには、元のデータフレームの列がそのまま残っていることがわかります。
concat関数には、joinやkeysといったオプションがあります。詳細は、pandasの公式ドキュメントを参照してください。
merge関数を使ったデータフレームの結合: 結合方法の選択と実例
merge関数を使うと、2つのデータフレームをキーに基づいて結合することができます。結合方法には、内部結合、外部結合、左外部結合、右外部結合があります。
以下は、基本的な使い方です。
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd # データフレームの生成 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' , 'K3' ], 'C' : [ 'C0' , 'C1' , 'C2' , 'C3' ], 'D' : [ 'D0' , 'D1' , 'D2' , 'D3' ]}) # データフレームの結合 result = pd.merge(left, right, on = 'key' ) print (result.head()) |
この場合、leftとrightの2つのデータフレームをkey列をキーにして結合したデータフレームがresultに格納されます。結合する際には、引数に結合するデータフレームを渡します。また、キーとなる列名は、onオプションで指定します。
実行結果は以下のようになります。
1 2 3 4 5 | 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 C3 D3 |
左外部結合の場合、leftオプションに指定したデータフレームのすべての行が結果に含まれます。rightオプションに指定したデータフレームの中で、キーが一致する行があれば、それらの列が結果に含まれます。
右外部結合の場合、rightオプションに指定したデータフレームのすべての行が結果に含まれます。leftオプションに指定したデータフレームの中で、キーが一致する行があれば、それらの列が結果に含まれます。
merge関数には、howやsuffixesといったオプションがあります。詳細は、pandasの公式ドキュメントを参照してください。
join関数によるデータフレームの合成: 複数のデータフレームを結合する方法と実例
join関数を使うと、複数のデータフレームをキーに基づいて結合することができます。merge関数と同様に、結合方法には、内部結合、外部結合、左外部結合、右外部結合があります。
以下は、基本的な使い方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd # データフレームの生成 left = pd.DataFrame({ 'A' : [ 'A0' , 'A1' , 'A2' ], 'B' : [ 'B0' , 'B1' , 'B2' ]}, index = [ 'K0' , 'K1' , 'K2' ]) right = pd.DataFrame({ 'C' : [ 'C0' , 'C1' , 'C2' ], 'D' : [ 'D0' , 'D1' , 'D2' ]}, index = [ 'K0' , 'K2' , 'K3' ]) top = pd.DataFrame({ 'E' : [ 'E0' , 'E1' , 'E2' ], 'F' : [ 'F0' , 'F1' , 'F2' ]}, index = [ 'K0' , 'K1' , 'K2' ]) # データフレームの結合 result = left.join([right, top]) print (result) |
この場合、left、right、topの3つのデータフレームを、インデックスをキーにして結合したデータフレームがresultに格納されます。結合する際には、引数に結合するデータフレームをリストで渡します。
次に、実際にデータフレームを結合する例を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd # データフレームの生成 left = pd.DataFrame({ 'A' : [ 'A0' , 'A1' , 'A2' ], 'B' : [ 'B0' , 'B1' , 'B2' ]}, index = [ 'K0' , 'K1' , 'K2' ]) right = pd.DataFrame({ 'C' : [ 'C0' , 'C1' , 'C2' ], 'D' : [ 'D0' , 'D1' , 'D2' ]}, index = [ 'K0' , 'K2' , 'K3' ]) top = pd.DataFrame({ 'E' : [ 'E0' , 'E1' , 'E2' ], 'F' : [ 'F0' , 'F1' , 'F2' ]}, index = [ 'K0' , 'K1' , 'K2' ]) # データフレームの結合 result = left.join([right, top], how = 'outer' ) print (result) |
実行結果は以下のようになります。
1 2 3 4 5 | A B C D E F K0 A0 B0 C0 D0 E0 F0 K1 A1 B1 NaN NaN E1 F1 K2 A2 B2 C2 D2 E2 F2 K3 NaN NaN C1 D1 NaN NaN |
left、right、topの3つのデータフレームを、インデックスをキーにして結合したデータフレームがresultに格納されます。結合方法には、howオプションを指定することができます。この例では、outerを指定しています。outerを指定することで、すべてのデータを含む外部結合が行われます。
join関数には、onやhow、sortといったオプションがあります。詳細は、pandasの公式ドキュメントを参照してください。
データフレーム合成時の注意点: インデックスの扱いや欠損値処理について
データフレームを合成する際には、以下のような注意点があります。
- データフレームを連結する場合、インデックスが重複するとエラーが発生します。
- merge関数を使って結合する場合、データフレームのキーが重複すると、重複した行が複数回現れる可能性があります。
- 欠損値が含まれる場合は、欠損値をどのように扱うかについて考慮する必要があります。
以下は、インデックスの重複に関する例です。
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd # データフレームの生成 df1 = pd.DataFrame({ 'A' : [ 'A0' , 'A1' , 'A2' ], 'B' : [ 'B0' , 'B1' , 'B2' ]}, index = [ 'K0' , 'K1' , 'K2' ]) df2 = pd.DataFrame({ 'A' : [ 'A3' , 'A4' , 'A5' ], 'B' : [ 'B3' , 'B4' , 'B5' ]}, index = [ 'K2' , 'K3' , 'K4' ]) # データフレームの連結 result = pd.concat([df1, df2]) print (result) |
実行結果は以下のようになります。
1 2 3 4 5 6 7 | A B K0 A0 B0 K1 A1 B1 K2 A2 B2 K2 A3 B3 K3 A4 B4 K4 A5 B5 |
K2というインデックスが重複しているため、エラーが発生しませんが、K2に対応する行が2つ現れていることがわかります。
次に、欠損値の扱いに関する例を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データフレームの生成 df1 = pd.DataFrame({ 'A' : [ 'A0' , 'A1' , 'A2' ], 'B' : [ 'B0' , 'B1' , 'B2' ], 'C' : [ 'C0' , np.nan, 'C2' ]}) df2 = pd.DataFrame({ 'A' : [ 'A0' , 'A1' , 'A2' ], 'B' : [ 'B0' , 'B1' , 'B2' ], 'D' : [ 'D0' , 'D1' , 'D2' ]}) # データフレームの結合 result = pd.merge(df1, df2, on = [ 'A' , 'B' ]) print (result) |
実行結果は以下のようになります。
1 2 3 4 | A B C D 0 A0 B0 C0 D0 1 A1 B1 NaN D1 2 A2 B2 C2 D2 |
df1とdf2の2つのデータフレームをAとBの列をキーにして結合しています。df1のC列に欠損値が含まれていますが、結合後のデータフレームでは、欠損値がNaNとして扱われています。
まとめ
この記事では、pandasを使ってデータフレームを合成する方法について紹介しました。
まず、concat関数を使ってデータフレームを縦方向および横方向に連結する方法を紹介しました。その後、merge関数を使ってデータフレームを結合する方法と、join関数を使って複数のデータフレームをキーに基づいて結合する方法を紹介しました。
データフレームを合成する際には、インデックスの扱いや欠損値処理に注意する必要があります。インデックスが重複する場合には、エラーが発生する可能性があるため、注意が必要です。
今回紹介した合成方法は、pandasの基本的な機能です。pandasには、さまざまな合成方法がありますので、pandasの公式ドキュメントを参照することをおすすめします。
以上で、「pandasでデータフレームを合成する方法:実践的な例とテクニック」の記事を終わります。