SeriesとDataFrame

目的

機械学習における学習データやビッグデータは様々な形式をとっている.そのため,様々な形式のデータを読み込み,必要なデータを取り出し,整形するといった前処理が必要となる.そのような処理をするときにpandas(Python Data Analysis Library)がよく使用される.ここでは,pandasの基本的なデータ形式であるSeriesとDataFrameについて学ぶ.

説明

Series

Seriesオブジェクトの生成

pandasにおけるSeriesは1次元的に並んでいるデータを扱うときに使用する.Seriesは様々なデータから作成できる.まずはSeriesの作り方を確認しよう.

1行目でpandasモジュールをインポートし,6,9,12,15行目でpandasモジュールのSeriesオブジェクトのコンストラクタを使用してSeriesオブジェクトを生成している.6行目では整数値からなるリストから,9行目では文字列からなるリストから,12行目では様々な型が混在したリストから,15行目ではnumpyモジュールのndarrayオブジェクト(1次元配列)からSeriesオブジェクトを生成している.各Seriesオブジェクトをprint文で表示すると,以下のように表示される.

valuesとindex

pandasのSeriesオブジェクトには,valueとindexと呼ばれるものがある.それらが何かを確認しよう.

5行目で英語・数学・国語のテストの点数からなるリストからSeriesオブジェクトを生成している.7行目で生成したSeriesオブジェクトのvalueを,8行目でその型を,9行目でindexを表示している.実行結果は以下のようになり,テストの点数がvalue,0から始まり2までの整数がindexを表していることがわかる.また,valueはnumpyモジュールのndarrayオブジェクトであることが確認できる.

indexの指定

上の例ではindexとして0から始まる連番の整数がつけられていた.indexを指定するには,以下のようにすればよい.

5行目では,Seriesオブジェクトのコンストラクタのキーワード引数indexに文字列からなるリストを指定している.8行目では,indexをキー・valuesを値とする辞書からSeriesオブジェクトを生成している.11行目でindexを指定せずにSeriesオブジェクトを生成し,12行目でindexを指定している.このように,様々な方法でindexを指定することができる.実行結果は以下のようになり,いずれの方法でもindexに科目名が設定されていることがわかる.

辞書のキーでは重複が許されなかったが,Seriesのindexは重複しても問題ない.

locプロパティ

Seriesオブジェクトからデータの一部を取り出すには,locプロパティを使用すればよい.Pythonにおけるプロパティとはオブジェクトが持っているデータの1つであり,メソッドとは記法が一部異なるので注意が必要である.

5行目で5教科のテストの点数からなるSeriesオブジェクトを生成している.7行目のようにSeriesオブジェクトのlocプロパティに大括弧で囲んで科目名を表す文字列を指定している.この例では英語の点数を取り出している.メソッドではメソッド名の後に小括弧で囲んで引数を指定したが,プロパティはデータであるため,今回のように大括弧で囲んで情報を指定することになる.8行目では,科目名からなるリストをlocプロパティで指定して,この例では英語と社会の点数からなるSeriesオブジェクトを生成している..9行目では,スライスを使用し,数学から理科まで(数学・国語・理科)の点数からなるSeriesオブジェクトを生成している.10行目もスライスを使用した例で,最初から国語までステップ幅2で(英語と国語の)点数を取り出している.

このように,locプロパティを使用することで,Seriesオブジェクトの一部を取得することができる.また,大括弧を小括弧としないようにすることと,リストで情報を指定する場合には,大括弧が2重となるので,1重としないように注意しよう.

ilocプロパティ

Seriesオブジェクトの一部は,indexの文字列でもindexの番号でも取り出すことができる.locプロパティではindexの文字列によりデータの一部を取り出したが,ilocプロパティではindex番号によりデータの一部を取り出すことができる.

7行目では,インデックス番号0を指定することで,英語の点数を取り出している.8行目では,インデックス番号からなるリストを指定し,英語と社会の点数を取り出している.9,10行目はスライスを使用した例で,9行目では数学・国語・理科の点数を,10行目では英語と国語の点数を取り出している.

DataFrame

pandasの基本的なデータ形式にはSeriesの他にDataFrameがある.Seriesが1次元的に並んでいるデータを扱うときに使用するのに対して,DataFrameは主に2次元的なデータを扱うときに使用する.

DataFrameオブジェクトの生成(2次元リストから)

まず,DataFrameの作り方を確認しよう.

5行目のように,pandasモジュールのDataFrameオブジェクトのコンストラクタに2次元のリストを引数として指定し,キーワード引数columnsに列の名前を表す文字列からなるリストを指定することで,DataFrameオブジェクトを生成している.この例では,5名の学生の英語・数学・国語のテストの点数からなるDataFrameオブジェクトを作っている.DataFrameオブジェクトには,Seriesオブジェクトと同様に,valuesとindexがあり,さらにcolumnsがある.15行目のようにcolumnsを表示すると,科目名を表す列の名前が出力されていることがわかる.

DataFrameオブジェクトの生成(indexの指定)

Seriesオブジェクトと同様に,DataFrameオブジェクトでもindexを指定することができる.

indexを指定してDataFrameオブジェクトを生成するには,コンストラクタのキーワード引数indexに文字列からなるリストを指定すればよい.11行目では,学生の名字からなるリストをindexとして指定し,DataFrameオブジェクトを生成している.実行結果は以下のようになり,列が科目を,行が学生を,値がテストの点数を表していることがわかる.

DataFrameオブジェクトの生成(辞書から)

DataFrameオブジェクトは辞書からも生成することができる.

5行目から7行目のように,科目名をキー・テストの点数からなるリストを値としてもつ辞書データからDataFrameオブジェクトを生成することができる.実行結果は以下のようになり,辞書のキーとして指定した文字列が列名となり,値として指定したリストが列のデータとなっていることがわかる.

locプロパティ

DataFrameオブジェクトの一部の要素を取得するには,Seriesオブジェクトと同様にlocプロパティを使用すればよい.

10行目のように,学生の名前と科目名をカンマで区切ってlocプロパティで指定すると,その学生の科目の点数を取得できる.11行目のように,学生の名前のリストと科目名のリストをlocプロパティに指定すると,複数の学生の複数の科目の点数を取得できる.12行目のように,スライスによって学生の名前と科目名を指定することもできる.

また,カンマで区切らずに学生名だけを指定することもできる.14行目のように,学生の名前だけを指定すると,その学生の全科目の点数を取得できる.15行目のように,複数の学生の名前だけそ指定すると,その学生たちの全科目の点数を取得できる.16行目のように,スライスによって学生の名前だけを指定することもできる.

ilocプロパティ

index番号とcolumn番号を指定してDataFrameオブジェクトの一部を取り出すには,ilocプロパティを使用すればよい.

10行目のように,行(index)番号と列(column)番号をカンマで区切ってilocプロパティで指定すると,その箇所のテストの点数を取得することができる.また,11行目のように,行番号のリストと列番号のリストをカンマで区切って指定することもできる.12行目は行番号と列番号をスライスで指定している例である.

ilocプロパティでは,カンマで区切らずに1つの値だけを指定することができる.この場合,行番号を指定することになる.14行目のように指定すると0番目の行の全列のデータが取得できる.15行目のように,複数の行番号からなるリストを指定することもできる.16行目は,スライスを使用して行番号を指定している例である.

課題

課題0

英語・数学・国語のテストの点数からなるSeriesオブジェクトを作り,数学の点数を取り出せ.

課題1

英語・数学・国語のテストの点数からなるSeriesオブジェクトを作り,国語と英語の点数をこの順で取り出せ.

課題2

英語・数学・国語・理科・社会のテストの点数からなるSeriesオブジェクトを作り,英語と数学と理科の点数を取り出せ.

課題3

英語・数学・国語・理科・社会のテストの点数からなるSeriesオブジェクトを作り,社会・理科・国語の点数をこの順で取り出せ.

課題4

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

課題5

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

課題6

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

課題7

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

課題8

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

課題9

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