DataFrameによる多次元データの表現

目的

ここまでは,pandasのDataFrameオブジェクトを使用して2次元データを表現した.ここでは,DataFrameを用いた多次元データの表現方法を学ぶ.

説明

階層構造の行をもつDataFrameオブジェクトの生成

タプルのリストからMultiIndexオブジェクトを生成する

3次元データをDataFrameオブジェクトで表現してみよう.例えば,1クラスの学生数が4名のクラスが2クラスあり,それぞれの学生の英語・数学・国語のテストの点数からなる3次元のデータをDataFrameオブジェクトで表現するには,以下のようにすればよい.

7行目から12行目で,2クラス・4名の学生・3教科のテストの点数データを生成し,最終的に12名☓3教科の2次元配列にreshapeしている.14行目から21行目で,クラスAとクラスBの0番から3番の学生を表すタプルのリストを作っている.22行目のように,pandasモジュールのMultiIndex.from_tuples関数を使用すると,タプルのリストからMultiIndexオブジェクトを生成できる.この例では,クラスと学生の番号を表すMultiIndexであるため,キーワード引数namesで名前をつけている.25行目のように,DataFrameオブジェクトを生成する際に,キーワード引数indexでMultiIndexオブジェクトを指定すると,階層構造を持ったindexをつけることができる.実行すると,以下のように表示され,生成されたMultiIndexオブジェクトの内容と,階層構造のindexがつけられたDataFrameオブジェクトが表示される.

リストの外積からMultiIndexオブジェクトを生成する

タプルのリストからMultiIndexオブジェクトを生成する方法の他に,リストの外積から生成する方法がある.

14行目のように,クラスAとBからなるリストと学生の番号0,1,2,3からなるリストのリストを作り,15行目のように,pandasモジュールのMultiIndex.from_product関数を使用すると,各リストの全ての組み合わせ(外積)からなるMultiIndexオブジェクトを生成できる.この例のような場合には,タプルのリストよりも簡潔にMultiIndexオブジェクトが生成できる.

階層構造の列をもつDataFrameオブジェクトの生成

以上の例では,DataFrameの行(index)が階層構造(MultiIndex)であった.次に,DataFrameの列(columns)を階層構造にしてみよう.例えば,4名の学生の3回のテストにおける英語・数学・国語の3教科の点数からなる3次元データをDataFrameオブジェクトとして表現するには,以下のようにすればよい.

7行目から12行目で,4名の学生の3回の3教科のテストの点数からなるデータを生成し,最終的に4名☓9の2次元配列にreshapeしている.14行目で試験の回数のリストと科目名のリストからなるリストを作り,15行目でMultiIndexオブジェクトを生成している.18行目で生成したMultiIndexオブジェクトを列名(columns)に指定することで,階層構造の列をもつDataFrameを生成することができる.(19行目は列が省略表示「…」されないための設定であり,20行目はDataFrameが途中で改行表示されないための設定である.)

階層構造の行と列をもつDataFrameオブジェクトの生成

以上の2つの例を組み合わせて,4次元のデータをDataFrameオブジェクトとして表現してみよう.2クラス・4名の学生・3回・3教科のテストの点数からなる4次元データを行・列ともに階層構造をもつDataFrameオブジェクトとして表現するには,以下のようにすればよい.

7行目から13行目で2クラス・4名の学生・3回・3教科のテストの点数からなるデータを作成し,最終的に8名☓9の2次元配列にreshapeしている.15,16行目で階層構造の行を表すMultiIndexオブジェクトを,17,18行目で階層構造の列を表すMultiIndexオブジェクトを生成し,20行目で行・列ともに階層構造のDataFrameオブジェクトを生成している.

階層構造の行と列をもつDataFrameオブジェクトへのアクセス

階層構造の行と列をもつDataFrameオブジェクトの一部の要素へアクセスするための基本的な方法を確認しよう.

直接アクセス

階層構造の行と列をもつDataFrameオブジェクトに直接アクセスするには,例えば以下のようにすればよい.

21行目のように記述すると,1回目のテストの点数のデータを取得することができる.22行目のように記述すると,1回目の英語のテストの点数のデータを取得することができる.23行目のように記述すると,1回目の英語のクラスAの学生のテストの点数のデータを取得することができる.24行目のように記述すると,1回目の英語のクラスAの0番の学生のテストの点数を取得することができる.

locプロパティによるアクセス

階層構造の行と列をもつDataFrameオブジェクトにlocプロパティを使用してアクセスするには,例えば以下のようにすればよい.

21行目のように記述すると,クラスAの学生のテストの点数のデータを取得することができる.22行目のように記述すると,クラスAの0番の学生のテストの点数のデータを取得することができる.23行目のように記述すると,クラスAの0番の学生の1回目のテストの点数のデータを取得することができる.24行目のように記述すると,クラスAの0番の学生の1回目の英語のテストの点数のデータを取得することができる.

課題

課題0

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数からなるDataFrameオブジェクトを作れ.

課題1

40名の学生(0-39)の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作れ.

課題2

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作れ.

課題3

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,2回目のテストの点数を取り出せ.

課題4

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,3回目国語の点数を取り出せ.

課題5

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,1回目の社会のクラスDの点数を取り出せ.

課題6

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,2回目の理科のクラスAの学生31の点数を取り出せ.

課題7

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,クラスCの学生のテストの点数を取り出せ.

課題8

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,クラスBの学生18のテストの点数を取り出せ.

課題9

1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,クラスDの学生23の3回目のテストの点数を取り出せ.