目的
これまでに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オブジェクトを結合せよ.