python PR

【python】データ分析のためのpandasの使い方⑧:mergeとconcat

記事内に商品プロモーションを含む場合があります

今回はpandasチュートリアルの八回目になっています。
前回のがまだという方は↓の記事を参照ください。

【python】データ分析のためのpandasの使い方⑦:良く使う関数!

今回は表結合に必須のmerge()とconcat()です!

データ分析をやる上で、色々なデータフレームを結合するシーンは多いと思います。
しかし、引数が複雑で思った通りに結合出来ないなんて事も多いです。
そんな方のために、今回は表結合の方法をマルっと解説していきます。

全てサンプルコードを記載してあります。各々のpythonの環境で実際に手を動かしながら読み進めていってください。

サクッとやりたい方は、google colaboratoryが簡単でおすすめです。

 

表結合はmarge()とconcat()

表結合とは単純にデータフレーム同士を結合させ、新しいデータフレームを作る事です。
データサイエンスでは何かと使う機会が多い手法です。

Pandasでは、複数のデータフレームを結合する方法として、mergeconcatの2つの関数があります。
簡単に説明しますね。

  • merge : 指定したキーに基づいて2つのデータフレームを結合する関数で、SQLのJOINに似た操作ができます。
  • concat : 縦または横方向に複数のデータフレームを単純に結合する関数です。

したがって、mergeは複数のデータフレームを、キーに基づいて結合するために使用され、concatは複数のデータフレームを縦または横方向に単純にサクッと結合するために使用されます。

それぞれの使い方を見ていきましょう。

 

concat()でデータフレームを結合

concat()関数を使用すると、データフレームを縦方向または横方向に連結することができます。
縦方向の場合、データフレームは上下に結合され、横方向の場合、データフレームは左右に結合されます。

 

concat()の使い方

以下は、concat()関数を使用して2つのデータフレームを横方向に結合する例です。

まずはサンプルのデータフレームを2つ作成します。

 

作成したテーブルの中身を見てみましょう。

df1->

df2->

 

concat()で横結合

ではこれをまずは横に結合したいと思います。
concat()の引数として、結合したいデータフレームをリストで渡し、axis=1と指定するだけです。

->

この様に、単純に横に結合したデータフレームができました。

 

concat()で縦結合

では続いて縦結合をしてみましょう。
axis=0とするだけですので非常に簡単です。

このように、concat()ではサクッとデータフレームを結合したい時に簡単に使えます。

また、concat()関数では、結合するデータフレームに対して、いくつかのパラメータを指定することができます。
例えば、ignore_indexパラメータをTrueに設定すると、元のインデックスを無視して、新しい連番のインデックスが作成されます。

 

indexが0~7まで振り直されました。

 

merge()でデータフレームを結合

merge()はconcat()と比べると、キーを基に結合出来るため、より自由度の高いデータフレームを作る事ができます。

私も実務で使うのはほぼほぼmerge()です。

 

merge()の引数

複雑な処理が出来るため、引数も多いです。

このように、様々な引数がありますが、全てを覚える必要はありません。
主要なものだけ解説していきます。

  • left: マージする左側のデータフレーム
  • right: マージする右側のデータフレーム
  • how: 結合方法。innerouterleftrightの4つのオプションがあります。デフォルトはinnerです。
  • on: マージするキー列(列名)またはキー列のリスト。左側と右側のデータフレームのどちらにも存在する列を指定します。
  • left_on: マージする左側のデータフレームのキー列(列名)
  • right_on: マージする右側のデータフレームのキー列(列名)
  • suffixes: カラム名が重複した場合に使用される、接尾辞を指定します。リスト形式で指定することができます。デフォルトでは、左側の接尾辞が _x、右側の接尾辞が _yになります。

 

leftとrightについて

まずは結合の元となるデータフレームをleftとrightで指定します。
そのまま、leftで指定したdfが左側にきて、rightで指定したdfが右側にきます。

例えば、一方には顧客の名前とIDを入れたdf_customersを作り、もう一方のデータフレームには顧客のIDと注文金額が含まれているdf_ordersを作ります。

そして、df_customersをleft、df_ordersをrightにして、顧客IDをキーに結合してみましょう。

 

結果として下記のデータフレームが出来ます。

leftとrightの指定を逆にすると、amountが左側に来てnameが右側に来ます。

 

howについて

howに指定する値としては、inner、outer、left、rightがあります。
以下は、how引数の説明です。

  • inner: 内部結合。両方のデータフレームに共通するキーのみを残して結合します。
  • outer: 外部結合。どちらか一方にだけあるキーも含めて結合します。
  • left: 左外部結合。左側のデータフレームにあるキーを基準に、右側のデータフレームを結合します。
  • right: 右外部結合。右側のデータフレームにあるキーを基準に、左側のデータフレームを結合します。

 

innner

innerでは両テーブルにあるキー項目のみ残ります。先ほどのデータフレームですと、顧客IDが両dfにある場合のみ残ります。

そのためcustomer_idが1,2,3のレコードしか残りません。

 

 

outerについて

逆にouterの場合はどちらか一方にしかないキーも残ります。

値が無い部分は欠損値のNaNが入ります。

 

left・rightについて

例えばleftとした場合は、leftに指定したデータフレームのキー項目全てと、それと合致するright側のレコードだけが結合されます。

 

結果↓のdfができます。

 

このように、left側(df_customers)にcustomer_idの1~5に関するレコードは両テーブルとも残りますが、rightにしかないcustomer_idが6のレコードは除外されます。

howの指定をrightにすると全く逆の事が起こります。
でも基本的には、わざわざrightを指定する事はあまりないと思います。
だったらleftで指定した方が分かりやすいので。

 

onについて

on引数は、結合する2つのデータフレームに共通する列名を指定するために使用されます。これにより、列名をキーとして2つのデータフレームが結合されます。

実は先ほどからcustomer_idをキーにするために、「on=’customer_id’」として使っていました。

結合するキーとなるカラムを指定します。

 

left_on、right_onについて

こちらも使い方はonと一緒なのですが、2つのデータフレームで結合したいキーのカラム名が違う場合に使います。

例えば、一方はkeyでもう一方はkey2となっていたらonは使えません。そんな時に使います。

結果、↓のdfができます。

howをinnerにしているので、df1のkeyカラムとdf2のkey2カラムの両方にある値のA、Bに関するレコードのみが結合されました。
howをouterにすると2つのdfの全てのレコードが結合されます。

 

 

suffixesとは?

suffixesは、重複する列名がある場合に、それらの列名を区別するために接尾辞を付けることができます。

具体的には、2つのデータフレームをマージするとき、重複する列名がある場合、suffixesを使用してそれぞれの列名に接尾辞を追加することができます。
デフォルトでは、接尾辞は _x_y が使われますが、suffixes引数を使用して独自の接尾辞を指定することもできます。

例えば、以下のような2つのデータフレームがあるとします。

これらのデータフレームを key 列でマージする場合、suffixes引数を使用して、接尾辞を指定できます。

結果↓の接頭辞が付いたdfが出来ました。

 

 

まとめ

いかがでしたでしょうか?
結合と言っても様々な方法があり、引数も多いためなかなか難しかったと思います。

特にhowでどの様に結合するのか?onでどのカラムをキーに結合するのか?などは重要になってきますので、どのような挙動になるのかを理解しておきましょう~。

今すぐに全てを覚える必要はないので、実践の中で色々試しながら学んでいきましょう。

 

あなたにおススメの記事