エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、こちらの前回記事に引き続いて、Pythonでデータ分析の支援を行うPandasのDataFrameを結合・連結するconcat関数について、使い方をまとめてみました。
なお、本記事内のPythonソースコードは、JupyterLabで動作を確認しているので、同様に動作確認したい方はこちらの記事も参照し、まずはJupyterLabの環境構築をおこなってください。
Pandasの結合・連結
Pandasの結合・連結とは、2つ以上のDataFrameを結合・連結したりすることを言います。
また、PandasでDataFrameを結合する関数として、大きくmerge関数とconcat関数の2つが存在します。
本記事では、concat関数を取り上げて使い方を紹介していきます。
Pandasのconcat関数の使い方まとめ
concat関数は、列名(カラム)をキーに2つ以上のDataFrameを1つに結合します。
それに加えて、結合方向を縦方向・横方向を選択することができます。
本記事では、concat関数のデフォルトが縦方向の結合なので、縦方向の結合を基本として使い方を紹介していきます。
列名をキーにして縦方向に結合(axis=0 or axis=’index’)
列名をキーにして縦方向に結合するには、concat関数の引数にDataFrameオブジェクトをリストで与えます。
また、引数axisによって結合方向を指定することができます。
【Pythonコード】
2つのDataFrameをconcat関数で縦方向に結合している例です。
以下の3つの例とも同じ結合結果になります。
1 |
pd.concat([df1, df2]) |
または
1 |
pd.concat([df1, df2], axis=0) |
または
1 |
pd.concat([df1, df2], axis='index') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
すべての列名をキーとするので、両方のDataFrameに存在する「氏名」「クラス」「数学」「国語」はそのまま結合されています。
そして、merge関数の場合は横方向であったが、concat関数はデフォルトで縦方向に結合しています。
また、インデックス番号は元のDataFrameの情報をそのまま結合していることがわかります。
インデックス番号を再度振り直す(ignore_index)
DataFrameを結合した後にインデックス番号を振り直すには、引数ignore_indexを使用します。
【Pythonコード】
引数ignore_indexを使ってインデックス番号を再度振り直す例です。
1 |
pd.concat([df1, df2], ignore_index=True) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
「ignore_index=True」を指定することで、結合結果のDataFrameのインデックス番号が再度振り直されていることがわかります。
元のDataFrameを区別する(keys)
結合した後も元のDataFrameを区別するためには、引数keysを使用します。
【Pythonコード】
引数keysを使用して結合している例です。
1 |
pd.concat([df1, df2], keys=['1番目', '2番目']) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
結合結果のDataFrameにkeysで指定した文字列がインデックスに追加されて、マルチインデックスになっていることがわかります。
これにより、元のDataFrameを区別することができます。
異なる列名を持つDataFrameを結合する
異なる列名を持つ2つのDataFrameを結合する場合について紹介します。
【Pythonコード】
「国語」を持つDataFrame(df1)と、「理科」を持つDataFrame(df4)を結合している例です。
1 |
pd.concat([df1, df4]) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
共通する列(「氏名」「クラス」「数学」)は縦方向にそのまま結合され、共通しない列(「国語」「理科」)の値はNaNになっています。
3つ以上のDataFrameを縦方向に結合
3つ以上のDataFrameを縦方向に結合する方法を紹介していきます。
3つのDataFrameを結合
3つのDataFrameを結合するには、concat関数の引数にDataFrameオブジェクトをリストで指定します。
【Pythonコード】
3つのDataFrameをconcat関数で結合している例です。
1 |
pd.concat([df1, df2, df3]) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
リストで指定した順でDataFrameオブジェクトが縦方向に結合されていることがわかります。
リストで指定するDataFrameオブジェクトを増やしていくと、3つ以上の結合が可能です。
元のDataFrameを区別する(keys)
元のDataFrameを区別するには、2つのDataFrameのときと同様に引数keysを使用します。
【Pythonコード】
引数keysを使用して結合している例です。
1 |
pd.concat([df1, df2, df3], keys=['1番目', '2番目', '3番目']) |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
結合方法を指定(join)
concat関数で結合方法を指定するには、引数joinを使用します。
結合方法が何かわからない方は、こちらを参照ください。
外部結合(join=’outer’)
外部結合によって左右両方のDataFrameのデータを残します。
【Pythonコード】
2つのDataFrameをconcat関数で外部結合している例です。
1 |
pd.concat([df1, df4], join='outer') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
外部結合した結果、「氏名」「クラス」「数学」はそのまま縦方向に結合しており、DataFrame独自の列「国語」「理科」もそれぞれ結合されていることがわかります。
内部結合(join=’inner’)
内部結合によって左右のDataFrameでお互い一致するデータを残します。
【Pythonコード】
2つのDataFrameをconcat関数で内部結合している例です。
1 |
pd.concat([df1, df4], join=‘inner') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
内部結合した結果、DataFrameで共通する列「氏名」「クラス」「数学」が縦方向に結合されていることがわかります。
左結合、右結合
concat関数では、左結合、右結合はできません。
左結合、右結合したい場合は、こちらのmerge関数を使用してください。
列名をキーにして横方向に結合(axis=1 or axis=’columns’)
DataFrameを横方向に結合するには、「axis=1」または「axis=’columns’」を使用します。
【Pythonコード】
2つのDataFrameをconcat関数で横方向に結合している例です。
1 |
pd.concat([df1, df4], axis=1) |
または
1 |
pd.concat([df1, df4], axis='columns') |
【表示結果】
上記PythonコードのDataFrameを表示すると、以下のようになります。
まとめ
いかがでしたでしょうか。
Pandasのconcat関数を使って結合・連結する方法を紹介してきました。
concat関数は、3つ以上のDataFrameの結合を行えたり、結合方向を縦・横に変更できたりするので、merge関数とうまく使い分けできるようになっておくとよいでしょう。
そして、Pandasの操作にはもっと色々な操作がありますので、ぜひ学んでマスターしていきましょう。