- 複数のDataFrameの結合をしたい方
- エクセルのVLOOKUP関数のようなことをPythonでやりたい方
(本記事のコードを作成した開発環境はGoogle Colaboratory Python 3.7.13 となります。)
本記事ではPythonのDataFrameを結合するメソッド
- concatメソッド
- mergeメソッド
の使い方について解説していきます。
本記事を読むことで思い通りに複数のDataFrameを結合することができるようになるかと思います。
特にmergeメソッドはエクセルのVLOOKUP関数のように基準となるキーを選択し、紐づけて結合することができますが、エクセルのVLOOKUP関数は一行ずつ行うのに対しmergeメソッドはDataFrame全体を結合することができるのでなれると便利かと思います。
- concatメソッドとmergeメソッドの違い
- concatメソッドの使い方
- concatメソッドの用途
- mergeメソッドの使い方
- mergeメソッドの用途
concatメソッドとmergeメソッドの違い
この2つのメソッドについて機能の違いを表にまとめました。
比較項目 | concat関数 | merge関数 |
結合可能なDataFrame数 | 複数 | 2つ |
結合時にキーにできるcolumn数 | – | 2つ以上 |
デフォルト時のデータの結合方向 | indexが増える | columnが増える |
結合の種類 | inner outer | inner outer left right |
- concat:複数のDataFrameをシンプルに連結させる(DataFrameを縦もしくは横に連結させる)
- merge:キーとなるデータ列を選択して2つのDataFrameを結合させる
という違いがあります。
concatメソッドの使い方
今回の解説で使うエクセルデータのリンクを下記に張っておきます。
エクセルデータ内には3つのSheetを用意しました。pandasをインポートしてからそれぞれdf1~3として読込むと下記のようになります。
DataFrameの連結
引数を特に指定しなければ指定したリスト内のDataFrameが縦に結合されます。
また、リストで指定するDataFrameは2つ以上あっても問題なく縦に結合されます。
この時、共通しないcolumnを持つDataFrameを結合した場合、それぞれデータがない部分はNaNになります。
index番号の振り直し
結合した後のindex番号は元のindex番号を継承しますが、引数ignore_index = True を選択することでindex番号を振り直すことができます 。
DataFrameを横に連結させる
引数axis = 1(もしくは「’columns’」)を選択することで横に結合することができます。
元のDataFrameを区別する
元のDataFrameをわかりやすくするために、引数keysでindexにラベルを設定することができます。
concatメソッドの用途
複数のエクセルデータを単純に結合する。
年月単位(店舗の月ごとの売上)や団体単位(学校クラスの成績)など、同じようなフォーマットで作られたエクセルデータを複数結合するのに便利です。エクセルを開いてコピペするより断然早く結合することができます。
Webスクレイピングでのデータ収集に活用
検索とデータ収集を繰り返すようなWebスクレイピングを行う際に、検索した内容を1行のDataFrameとして格納し、それをconcatメソッドで重ねていくように連結していくことによりデータベースを簡単に作ることができたりします。
mergeメソッドの使い方
今回の解説で使うエクセルデータのリンクを下記に張っておきます。
エクセルデータ内には3つのSheetを用意しました。それぞれdf4~6として読込むと下記のようになります。
キーとなるcolumn名を選択して結合
結合する2つのDataFrameを選択し、引数onでキーとなるcolumn名を選択します。下記では「店舗名」columnをキーとしてdf4とdf5を結合させました。
キーとなるcolumn名が異なる場合、引数left_on及びright_onを使用して各DataFrameごとにキーとなるcolumn名を選択します。
また、引数left_index及びright_indexを True にすることで indexを結合キーにすることもできます。
結合の種類
結合の種類は4種類あります。引数howで選択します。
inner
2つのDataFrameの共通しているキーのみ結合します。(howのデフォルトはinner)
outer
共通しているものだけ結合し、それ以外もそのまま残ります。
left
左のDataFrameをベースに結合します。
right
右のDataFrameをベースに結合します。