DataFrameの操作

目的

これまでにpandasの基本的なデータであるSeriesオブジェクトとDataFrameオブジェクトの作り方と,様々な方法により各オブジェクトの一部にアクセスする方法を学んだ.ここでは,DataFrameオブジェクトに対してよく使用する処理を学ぶ.

説明

列に対して条件を指定し,条件を満たす行を抽出する

直接アクセス

DataFrameオブジェクトの各列のデータに対して条件を指定し,条件を満たす行を抽出する方法を確認しよう.

5行目から11行目で,9冊の本のタイトル・著者・出版社・ジャンル・価格・在庫数・レーティングからなるDataFrameオブジェクトを生成している.このDataFrameオブジェクトからジャンルがミステリーである本の情報を取得したければ,13行目のように記述すればよい.また,ジャンルがミステリーでレーティングが4以上の本の情報を取得したければ,14行目のように複数の条件を指定すればよい.さらに,値段が2000円未満の本で条件を絞りたければ,15行目のように3つ目の条件を加えればよい.

locプロパティ

以上の処理は,以下のようにlocプロパティを使用した書き方でも実現できる.

isinメソッド

DataFrameオブジェクトの各列のデータに対して「いくつかの候補のいずれかであれば」というような条件を指定する場合に,以上の方法では冗長な記述になる.そのような場合にはDataFrameオブジェクトのisinメソッドを使用することができる.

13行目のように,本のcategory列のオブジェクトのisinメソッドを,引数にジャンルのリストを指定して呼び出すと,そのいずれかを含むジャンルの本の情報が取得できる.この例では,ミステリーかSFのジャンルの本の情報を取得している.また,14,15行目のように,様々な列に対して複数の条件を指定することができる.

文字列操作メソッド

DataFrameオブジェクトの列に対して,ある文字列の一部が含まれているデータを取り出したいときには,DataFrameオブジェクトの文字列操作メソッドを使用すればよい.

13行目のように,本のcategory列のオブジェクトのstr.containsメソッドを,引数にジャンルに含まれる文字列を指定して呼び出すと,その文字列を含むジャンルの本の情報が取得できる.14行目では,str.startwithメソッドを使用し,指定した文字列で始まるジャンルの本の情報を取得している.15行目では,str.endswithメソッドを使用し,指定した文字列で終わる出版社の本の情報を取得している.

列の値を条件に応じて書き換える

locプロパティ

DataFrameオブジェクトの要素の値を条件に応じて書き換えてみよう.例えば,本のジャンルの「sf」を「science fiction」に変えるには,以下のようにすればよい.

locプロパティを使用して,14行目のように記述すると,category列が「sf」である本のジャンルを「science fiction」に変更することができる.

以上の処理はlocプロパティを使用しなければならず,直接アクセスを使用し,以下のように記述するとエラーとなるので,注意が必要である.

文字列操作メソッド

本のジャンルの「sf」を「science fiction」に変える処理は,DataFrameオブジェクトの文字列操作メソッドを使用して,以下のようにも記述できる.

14行目のように,本のcategory列のオブジェクトのstr.replaceメソッドを,引数に置換前の文字列と置換後の文字列を指定して呼び出すと,文字列を指定した通りに置換することができる.このメソッドは呼び出すだけでは内容が更新されないため,代入文で書き換える必要がある.

列を追加し,条件に応じて値を設定する

DataFrameのある列の値に応じて,新しく追加した列に値を設定する方法を確認しよう.例えば,本のレーティングが4以上であればレコメンドが高い,4未満であればレコメンドが低いと設定するには,以下のようにすればよい.

locプロパティを使用して,14行目のように記述すると,rating列の値が4以上の場合にrecommend列にhighが代入される.locメソッドでは代入文により列を追加することができたため,自動的に recommend列が追加される.また,15行目のように記述すると,rating列の値が4未満の場合にrecommend列の値はlowとなる.

columns(列名)・index(行名)を変更する

DataFrameオブジェクトのcolumns(列名)やindex(行名)を変更するには,以下のようにすればよい.

14行目のように,DataFrameオブジェクトのrenameメソッドを,キーワード引数columnsに,変換前の列名をキー・変換後の列名を値とする辞書を指定して呼び出すと,列名が変更される.また,キーワード引数indexに,変換前の行名をキー・変換後の行名を値とする辞書を指定して呼び出すと,行名が変更される.renameメソッドはオブジェクトのデータを書き換えないため,代入文によって列名・行名を変更したオブジェクトを取得している.変更する列や行は複数指定することができ,15行目では2つの列・2つの行の名前を変更している.

列の値によりソートする

1つの列の値によりソートする

列の値により行をソートするには,以下のようにすればよい.

13行目のように,DataFrameオブジェクトのsort_valuesメソッドを列名を引数に指定して呼び出すと,指定した列の値の昇順に行がソートされる.sort_valuesメソッドもオブジェクトのデータは書き換えないため,代入文によりソートしたオブジェクトを取得している.この例では,ジャンルが辞書順にソートされる.14行目のように記述すると,価格が安いものから高いものの順にソートされる.15行目のようにキーワード引数ascendingにFalseを指定すると,降順にソートすることができる.この例では,レーティングが高いものから低いものの順にソートされる.

複数の列の値によりソートする

複数の列の値により行をソートするには,以下のようにすればよい.

13行目のように,sort_valuesメソッドを,複数の列名からなるリストを引数に指定して呼び出すと,複数の列の値により行をソートすることができる.その際,リストの前に指定した列が優先してソートされる.この例では,ジャンル名の辞書順でソートし,ジャンル名が同じものは価格が安いものから高いものへとソートしている.また,14行目のように記述すると,ジャンル名は辞書順に,ジャンル名が同じものはレーティングが高いものから低いものへとソートすることができる.

課題

課題0

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,atプロパティにより学生2の理科の点数を取り出せ.

課題1

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,iatプロパティにより学生1の国語の点数を取り出せ.

課題2

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,属性アクセスにより,全学生の数学の点数を取り出せ.

課題3

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,列名による直接アクセスにより,全学生の英語の点数を取り出せ.

課題4

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,列名のリストによる直接アクセスにより,全学生の国語と社会の点数を取り出せ.

課題5

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,行番号のスライスによる直接アクセスにより,学生1から学生3までの全教科の点数を取り出せ.

課題6

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,全学生の国語の点数を100点に変更せよ.

課題7

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,全学生の英語と理科の点数を10点増やせ.

課題8

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,音楽のテストの点数を追加せよ.

課題9

学生6人分(学生0から学生5)の英語・数学・国語・理科・社会のテストの点数からなるDataFrameオブジェクトを作り,学生6のテストの点数を追加せよ.