DataFrameの結合

目的

これまでにpandasの基本的なデータであるSeriesオブジェクトとDataFrameオブジェクトの様々な操作について学んだ.ここでは,DataFrameオブジェクトの様々な結合処理について学ぶ.

説明

DataFrameの結合(concat, append)

concat関数

同じ列名をもつDataFrameを列方向に結合するには,以下のようにすればよい.

5行目から19行目で,同じ列名をもつDataFrameオブジェクトを3つ作っている.21行目のように,pandasモジュールのconcat関数を,結合したいDataFameオブジェクトからなるリストを引数として指定して呼び出すと,結合されたDataFrameオブジェクトが返される.実行すると,以下のように列方向にDataFrameが結合される.

appendメソッド

DataFrameオブジェクトのappendメソッドを使用しても,同じ列名をもつ2つのDataFrameを列方向に結合することができる.

5行目から14行目で,同じ列名をもつDataFrameオブジェクトを2つ作っている.16行目のように,1つ目のDataFrameオブジェクトのappendメソッドを,もう1つのDataFrameオブジェクトを引数として指定して呼び出すと,1つ目のDataFrameオブジェクトにもう1つのDataFrameオブジェクトが結合されたDataFrameオブジェクトが返される.実行すると,以下のように列方向にDataFrameオブジェクトが結合される.

appendメソッド(リスト)

appendメソッドを使用して,同じ列名をもつ複数のDataFrameオブジェクトを列方向に結合するには,以下のようにすればよい.

5行目から19行目で,同じ列名をもつDataFrameオブジェクトを3つ作っている.21行目のように,1つ目のDataFrameオブジェクトのappendメソッドを,残り2つのDataFrameオブジェクトからなるリストを引数として指定して呼び出すと,1つ目のDataFrameオブジェクトに残り2つのDataFrameオブジェクトが結合されたDataFrameオブジェクトが返される.実行すると,以下のように列方向にDataFrameオブジェクトが結合される.

DataFrameの結合(merge)

例えば,学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・氏名・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績のDataFrameオブジェクトがあるとする.この2つのDataFrameオブジェクトを学籍番号をキーとして結合する処理を考えよう.

同じキーをもつDataFrameの結合

同じキーをもつ2つのDataFrameオブジェクトを結合するには,以下のようにすればよい.

5行目から10行目で,同じキーをもつ2つのDataFrameオブジェクトを作っている.12行目のように,pandasモジュールのmerge関数を,2つのDataFrameオブジェクトを引数として指定し,キーワード引数onにキーとなる列名を指定して呼び出すと,指定したキーで結合されたDataFrameが返される.実行すると,キーにより2つのDataFrameオブジェクトが行方向に結合される.

異なるキーをもつDataFrameの結合(デフォルト)

異なるキーをもつ2つのDataFrameオブジェクトを結合してみよう.

5行目から10行目でキーの異なる2つのオブジェクトを作っている.12行目のように記述すると,以下のようにどちらのDataFrameオブジェクトにも存在するキーで結合されたDataFrameオブジェクトが返され,片方にしか存在しないキーは無視される.

異なるキーをもつDataFrameの結合(left)

異なるキーをもつ2つのDataFrameオブジェクトは以下のように結合することもできる.

12行目のように,merge関数のキーワード引数howに’left’を引数として指定すると,左のDataFrameオブジェクトのキーで結合される.右にしか存在しないキーは無視され,左にしか存在しないキーには「nan」が結合される.

異なるキーをもつDataFrameの結合(right)

12行目のように,merge関数のキーワード引数howに’right’を引数として指定すると,右のDataFrameオブジェクトのキーで結合される.左にしか存在しないキーは無視され,右にしか存在しないキーには「nan」が結合される.

異なるキーをもつDataFrameの結合(outer)

12行目のように,merge関数のキーワード引数howに’outer’を引数として指定すると,左右のDataFrameオブジェクトの全てのキーで結合される.どちらかにしか存在しないキーには「nan」が結合される.

異なるキーをもつDataFrameの結合(inner)

12行目のように,merge関数のキーワード引数howに’inner’を引数として指定すると,どちらのDataFrameオブジェクトにも存在するキーで結合される.どちらかにしか存在しないキーは無視される.これはhowキーワードを指定しない場合と同様である.

異なるキーをもつDataFrameの結合の確認(indicator)

以上のように,異なるキーをもつDataFrameを結合する場合,両方に存在するキー・左にしか存在しないキー・右にしか存在しないキーの3通りがある.それを確認するには,以下のようにすればよい.

12行目のように,merge関数のキーワード引数indicatorにTrueを指定すると,以下のように,「_merge」という名前の列が追加され,そこに両方に存在するキー(both)・左にしか存在しないキー(left_only)・右にしか存在しないキー(right_only)のいずれかが格納される.

複数のキーによるDataFrameの結合

複数の列をキーとして指定してDataFrameを結合したい場合には,以下のようにすればよい.

14行目のように,merge関数のキーワード引数onに複数の列名をリストで指定すれば,複数のキーによりDataFrameを結合することができる.キーワード引数howを指定しない場合はinnerとなるため,以下のように両方に存在するキーの組み合わせ「K0, K0」と「K1, K1」でのみ結合される.1つのキーのときと同様に,left, right, outerで結合することもできる.

重複したキーをもつDataFrameの結合

通常重複しないもの(一意に行を指定できるもの)をキーとすることが多いが,重複したキーをもつDataFrameを結合するとどうなるか確認しよう.

5行目から7行目で重複しないキーをもつDataFrameオブジェクトを,8行目から10行目で重複したキー「K2」をもつDataFrameオブジェクトを作っている.12行目のように,これらをouterで結合すると,以下のようになり,「K2」の行が2つでき,左半分は同じで右半分が異なる形で結合されることがわかる.

キーが重複しないようにしたい場合には,以下のようにすればよい.

merge関数のキーワード引数validateに’one_to_one’を指定すると,以下のようなエラーが表示され,キーが重複していることが確認できる.

キーワード引数validateには’one_to_one’の他に,’one_to_many’, ‘many_to_one’, ‘many_to_many’を指定できる.

DataFrameの結合(join)

デフォルト(left)

DataFrameでは,indexに一意に行を指定できる数値や文字列を与えることが多い.そのため,ある列をキーとする代わりにindexをキーとしてDataFrame同士を結合することがある.

5行目から10行目のような2つのDataFrameオブジェクトをindexをキーとして結合するには,12行目のようにjoinメソッドを使用すればよい.実行すると,以下のように,2つのDataFrameオブジェクトがindexをキーとして,leftで結合されていることがわかる.

right

merge関数と同様に,joinメソッドでもキーワード引数howで結合方法を指定できる.

12行目のようにrightを指定した場合,結果は以下のようになる.

outer

キーワード引数howにouterを指定すると以下のようになる.

inner

キーワード引数howにinnerを指定すると以下のようになる.

merge関数

indexをキーとしてDataFrameオブジェクトを結合するには,以上のようにjoinメソッドを使用する方法の他に,merge関数を使用する方法もある.

12行目のように,merge関数のキーワード引数left_index, right_indexにTrueを指定すると,左右のDataFrameオブジェクトともにindexをキーとして結合することができる.例えばleftで結合すると,以下のようになる.

課題

課題0

学籍番号・氏名・メールアドレス・電話番号からなるDataFrameオブジェクトを3つ作り,concat関数により列方向に結合せよ.

課題1

学籍番号・氏名・メールアドレス・電話番号からなるDataFrameオブジェクトを2つ作り,appendメソッドにより列方向に結合せよ.

課題2

学籍番号・氏名・メールアドレス・電話番号からなるDataFrameオブジェクトを3つ作り,appendメソッドにより列方向に結合せよ.

課題3

学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.

課題4

学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.その際に,名簿にはあるが成績表にはない学籍番号と,名簿にはないが成績表にはある学籍番号を作り,leftで結合せよ.

課題5

学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.その際に,名簿にはあるが成績表にはない学籍番号と,名簿にはないが成績表にはある学籍番号を作り,rightで結合せよ.

課題6

学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.その際に,名簿にはあるが成績表にはない学籍番号と,名簿にはないが成績表にはある学籍番号を作り,innerで結合せよ.

課題7

学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.その際に,名簿にはあるが成績表にはない学籍番号と,名簿にはないが成績表にはある学籍番号を作り,outerで結合せよ.

課題8

学籍番号・氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号・英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.その際に,成績表の学籍番号がミスで重複しているようにし,ミスを発見するようにせよ.

課題9

学籍番号をindexとし,氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号をindexとし,英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,学籍番号をキーに2つのDataFrameオブジェクトを結合せよ.