DataFrameへのアクセス

目的

これまでにpandasの基本的なデータであるSeriesオブジェクトとDataFrameオブジェクトの作り方と,loc, ilocプロパティにより各オブジェクトの一部を取り出す方法を学んだ.ここでは,loc, ilocプロパティ以外の方法で各オブジェクトの一部を取り出す方法を学ぶ.

説明

DataFrameオブジェクトとSeriesオブジェクト

まず,DataFrameオブジェクトとSeriesオブジェクトの関係を確認しよう.

6行目から8行目で5行4列の連番の整数値からなるDataFrameオブジェクトを生成し,行(row)名をr0, r1, …とし,列(column)名をca, cb, …としている.11行目でDataFrameオブジェクトの列caを取り出し,その型を13行目で表示している.実行結果からわかるように,DataFrameオブジェクトの列caはSeriesオブジェクトとなっていることがわかる.

at, iatプロパティによるアクセス

atプロパティやiatプロパティを使用すると,DataFrameオブジェクトやSeriesオブジェクトの1つの要素を取り出すことができる.

6行目から8行目でDataFrameオブジェクトを作り,9行目でDataFrameオブジェクトの1列を取り出すことでSeriesオブジェクトを作っている.11行目のように,DataFrameオブジェクトのatプロパティに行名と列名をカンマで区切って指定すると,その位置の値を取り出すことができる.また,12行目のように,iatプロパティに行番号と列番号をカンマで区切って指定することで,その位置の値を取得することもできる.Seriesオブジェクトに対しては,14行目のようにatプロパティに行名を,15行目のようにiatプロパティに行番号を指定することで,その位置の値を取り出すことができる.同様の処理はloc, ilocプロパティでも可能であるが,at, iatプロパティの方が高速である.

属性(attribute)によるアクセス

DataFrameオブジェクトの列やSeriesオブジェクトの1つの要素は属性を使用して取り出すことができる.

11行目のように,DataFrameオブジェクト名の後に「.」を,その後に列を表す名前(この例では「cb」)を記述すると,その列を取り出すことができる.この変数のように使用される列名を属性と呼び,このようなデータのアクセスの仕方を属性アクセスと呼ぶ.また,12行目のように,Seriesオブジェクトに対してもindex名の属性(この例では「r1」)を使用してデータにアクセスできる.

ラベル名(列名)による直接アクセス

DataFrameオブジェクトの列やSeriesオブジェクトの1つの要素は,以下のように取り出すこともできる.

プロパティも属性もメソッドも使用せず,11行目のように,DataFrameオブジェクト名の後に直接大括弧で囲んで列名を指定することで,その列のデータを取得することができる.また,12行目のように,\seriesオブジェクト名の後に大括弧で囲んでindexの名前を指定することで,1つの要素を取得することができる.

ラベル名(列名)のリストによる直接アクセス

直接アクセスする方法では,ラベル名のリストを指定することで,DataFrameの複数列のデータや,Seriesの複数の要素を取得することができる.

11行目のように,複数の列名からなるリストをDataFrameオブジェクトに直接指定すると,複数列のデータを取得することができる.また,12行目のように,複数のindex名からなるリストをSeriesオブジェクトに直接指定すると,複数の要素を取得することができる.

index(行)番号のスライスによる直接アクセス

直接アクセスする方法では,行番号のスライスによりDataFrameの複数行のデータを,index番号のスライスによりSeriesの複数の要素を取得することができる.

11行目のように,行番号のスライスをDataFrameオブジェクトに直接指定すると,スライスで指定した複数行のデータを取得することができる.また,12行目のように,index番号のスライスをSeriesオブジェクトに直接指定すると,スライスで指定した複数の要素を取得することができる.

代入とブロードキャスト

ここまででDataFrameにアクセスする様々な方法を学んだ.これまでの例ではデータの一部を参照し表示するだけであったが,ここではアクセスしたデータを変更してみよう.

10行目でDataFrameオブジェクトをコピーし,11,12行目でloc, ilocプロパティを使用してデータの一部にアクセスし,代入文により値を変更している.15,16行目はat, iatプロパティを,19行目は属性を使用した例であり,22行目は列名,25行目は列名のリスト,28行目は行番号のスライスによる直接アクセスを使用した例である.実行結果は以下のようになり,ndarray配列と同様にブロードキャストが行われていることがわかる.

代入文によるDataFrameへの列・行の追加

Pythonの辞書では,新しくキーを指定して代入文で値を追加することができた.DataFrameでも,新しく列名や行名を指定してDataFrameに列や行を追加することができる.

10行目でDataFrameをコピーし,11行目でコピーしたDataFrameの列ceに対して代入を行っている.元のDataFrameに列ceがないため,列が追加される.14行目ではDataFrameの行r5に対して代入を行っているが,元のDataFrameに行r5がないため,行が追加される.

ちなみに,ilocを使用して行を追加しようとすると,エラーとなるため注意が必要である.

繰り返しによる全要素へのアクセス

行方向への繰り返し

DataFrameオブジェクトのiterrowsメソッドを使用すると,行方向への繰り返し処理ができる.

11行目のように,DataFrameオブジェクトのiterrowsメソッドを呼び出すと,イテラブルなオブジェクトが返され,for文とともに使用すると,indexの各値と各行のSeriesオブジェクトを取得することができる.

2重の繰り返しによる全要素へのアクセス

上記の各行のオブジェクトはSeriesオブジェクトである.Seriesオブジェクトに対して繰り返しを行うことで,列方向に繰り返し処理ができる.

11行目で行方向の繰り返しを行った後に,13行目のように各行のオブジェクトrowに対して繰り返しを行うことで,全ての要素の値を取得することができる.

課題

課題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のテストの点数を追加せよ.