目的
pandasのDataFrameオブジェクトは様々な形式でファイルに出力し,様々な形式のファイルから入力することができる.ここでは,csvファイルとMicrosoft Excel形式のファイルへの入出力について学ぶ.
説明
DataFrameのcsvファイルへの入出力
csvファイルへの出力
DataFrameオブジェクトをcsvファイルに書き出す方法を確認しよう.
9行目から13行目でテストの点数からなる2次元配列を作成し,15行目でDataFrameオブジェクトを作っている.16行目のように,DataFrameオブジェクトのto_csvメソッドをファイル名を引数で指定して呼び出すと,csv形式のファイルに書き出すことができる.
csvファイルからの入力
csvファイルからデータを読み込み,DataFrameオブジェクトを生成するには以下のようにすればよい.
6行目のように,pandasモジュールのread_csv関数をファイル名を引数に指定して呼び出すと,指定したファイルからデータを読み込み,DataFrameオブジェクトを作ることができる.実行すると,以下のように表示される.
上の例では,「Unnamed: 0」という名前の列ができ,その列に元のDataFrameのindexが入力されている.これをindexとするには,以下のようにすればよい.
6行目のように,read_csv関数のキーワード引数index_colに0を指定すると,0番目の列をindexとすることができる.実行結果は以下のようになり,余分な列が作られていないことがわかる.
階層構造の行をもつDataFrameのcsvファイルへの入出力
階層構造の行をもつDataFrameオブジェクトをcsvファイルへ書き出す方法と読み込む方法を確認しよう.
csvファイルへの出力
階層構造の行をもつDataFrameオブジェクトをcsvファイルへ書き出す方法は通常のDataFrameオブジェクトの場合と同様である.
9行目から14行目でテストの点数からなる配列データを作り,16,17行目でMultiIndexオブジェクトを,19行目で階層構造の行をもつDataFrameオブジェクトを生成している.20行目で階層構造の行をもつDataFrameオブジェクトをcsvファイルに書き出している.
csvファイルからの入力
通常のDataFrameオブジェクトと同様の方法でcsvファイルからデータを読み込んでみよう.
6行目でcsvファイルからデータを読み込み,DataFrameオブジェクトを生成している.実行すると,以下のように表示され,index(行名)がMultiIndexになっておらず,「student_no」という行ができていることがわかる.
これをMultiIndexとして読み込むには,以下のように記述すればよい.
6行目のように,read_csv関数のキーワード引数index_colに複数の列番号をリストで指定すると,階層構造の行をもつDataFrameオブジェクトとして読み込むことができる.実行すると,以下のように表示され,行が階層構造となっていることが確認できる.
階層構造の行と列をもつDataFrameオブジェクトのcsvファイルへの入出力
列も階層構造であるDataFrameオブジェクトをcsvファイルに書き出し,csvファイルから読み込んでみよう.
csvファイルへの出力
9行目から14行目でテストの点数からなる配列データを作り,17行目から20行目でMultiIndexオブジェクトを2つ作り,19行目で階層構造の行と列をもつDataFrameオブジェクトを生成している.20行目で階層構造の行と列をもつDataFrameオブジェクトをcsvファイルに書き出している.
csvファイルからの入力
6行目のようにcsvファイルからデータを読み込み,DataFrameオブジェクトを生成すると,以下のようになり,階層構造の行名が正しく入力されていないことがわかる.
階層構造の行をもつDataFrameオブジェクトをcsvファイルから読み込むには,以下のようにすればよい.
6行目のように,read_csv関数のキーワード引数headerに複数の行番号をリストで指定すると,階層構造の行をもつDataFrameオブジェクトとしてデータを読み込むことができる.実行すると以下のように表示され,行・列ともに階層構造で読み込めていることがわかる.
DataFrameオブジェクトのxlsxファイルへの入出力
DataFrameオブジェクトをMicrosoft Excel形式のxlsxファイルへ書き出す方法と,ファイルから読み込む方法を確認しよう.
xlsxファイルへの出力
先程の例と同じ階層構造の行と列をもつDataFrameオブジェクトをxlsxファイルに書き出してみよう.
23行目のように,DataFrameオブジェクトのto_excelメソッドをファイル名を引数で指定して呼び出すと,xlsxファイルにDataFrameオブジェクトの内容を書き出すことができる.
xlsxファイルからの入力
xlsxファイルからデータを読み込み,DataFrameオブジェクトを生成するには,以下のようにすればよい.
6行目のように,pandasモジュールのread_excel関数をファイル名を引数として指定して呼び出すと,xlsxファイルからデータを読み込み,DataFrameオブジェクトを生成することができる.この例では,6行目のようにindex_colとheaderを指定することで,階層構造の行と列をもつDataFrameオブジェクトを生成している.実行すると以下のように表示され,正しくデータが読み込みていることがわかる.
複数のDataFrameオブジェクトのxlsxファイルへの入出力
Microsoft Excelでは,複数のSheetをBookとして1つのxlsxファイルで表現することができる.ここでは複数のDataFrameオブジェクトを複数のSheetとしてxlsxファイルに書き出す方法と,複数のSheetをもつxlsxファイルからデータを読み込む方法を確認しよう.
xlsxファイルへの出力
複数のDataFrameオブジェクトを1つのxlsxファイルに書き出すには,以下のようにすればよい.
9行目から13行目で学生名簿のDataFrameオブジェクトを,14行目から17行目でテストの点数のDataFrameオブジェクトを作っている.19行目のように,pandasモジュールのExcelWriterコンストラクタをファイル名を引数として指定して呼び出すと,ExcelWriterオブジェクトを生成することができる.20,21行目のように,DataFrameオブジェクトのto_excelメソッドを,引数にExcelWriterオブジェクトを指定して呼び出すと,ファイルにDataFrameオブジェクトの内容を書き出すことができる.このとき,キーワード引数sheet_nameに文字列を指定すると,指定した文字列を名前とするSheetにデータが書き出される.この例では「students_list」という名前のSheetに学生名簿のDataFrameオブジェクトの内容を,「scores」という名前のSheetにテストの点数のDataFrameオブジェクトを書き出している.
xlsxファイルからの入力
複数のSheetをもつxlsxファイルからデータを読み込み,複数のDataFrameオブジェクトを生成するには,以下のようにすればよい.
6行目のように,pandasモジュールのExcelFileコンストラクタをファイル名を引数として指定して呼び出すと,ExcelFileオブジェクトを生成することができる.7,8行目のように,pandasモジュールのread_excel関数をExcelFileオブジェクトを引数として指定して呼び出すと,xlsxファイルからデータを読み込み,DataFrameオブジェクトを生成することができる.このとき,キーワード引数sheet_nameにSheet名を指定すると,指定した名前のSheetからデータを読み込むことができる.実行すると,以下のように表示され,データが読み込まれていることがわかる.
上の例では,電話番号が整数値データとして読み込まれてしまい,先頭の番号「0」が消えてしまっている.データを読み込むときに型の指定をするには,以下のようにすればよい.
7行目のように,read_excel関数のキーワード引数dtypeに,型を指定したい列名と型を辞書として指定すると,指定した列のデータを指定した型で読み込むことができる.この例では「phone_number」を文字列型として読み込むようにしている.実行結果は以下のようになり,電話番号が文字列データとして読み込まれていることがわかる.
SSDSE(教育用標準データセット:Standardized Statistical Data Set for Education)
SSDSEは,データ分析のための汎用素材として作成・公開している統計データで,様々な 公的統計データがまとめられたデータセットである.市区町村別のデータ(SSDSE-2019A)と都道府県別の時系列データ(SSDSE-2020B)があり,それぞれがxlsx形式とcsv形式で公開されている.ここでは,これらのファイルからデータをDataFrameオブジェクトとして読み込み,一部の
データを視覚化してみよう.
SSDSE-2019Aデータの読み込み
SSDSE-2019Aのcsvファイルをダウンロードして,データを読み込んでみよう.
7行目から12行目でSSDSE-2019Aのcsvファイルをダウンロードしている.ダウンロードしたファイルを開くとわかるが,0列目が地域コード,1列目が都道府県,2列目が市区町村となっている.0列目の地域コードは各市区町村に一意につけられているコードであるため,DataFrameのindexとして扱うには都合がよい.あるいは,1列目の都道府県と2列目の市区町村をMultiIndexとして使用しても,各市区町村を一意に指定でき,都道府県ごとにデータを処理することができる.ここでは後者の方法をとることとし,14行目のように1列目と2列目をMultiIndexとして読み込んでいる.また,0行目が各項目のコード,1行目が年度,2行目が各項目の日本語表記となっている.ここでは,2行目の各項目の日本語表記を列名とするととし,14行目のようにキーワード引数headerに2を指定している.また,csvファイルの内容が文字コードShift-JISの日本語で記述されているため,キーワード引数encodingで「shift-jis」を指定している.
また,SSDSE-2019Aのxlsxファイルを使用したい場合には,以下のようにすればよい.
SSDSE-2019Aの一部のデータの取り出し
では,このデータの中から一部のデータを取り出してみよう.例えば,東京都・埼玉県・千葉県・神奈川県の幼稚園数・小学校数・中学校数・高等学校数のデータを取り出すには以下のようにすればよい.
16,17行目で取り出したい都道府県の項目をリストとして表現している.18,19行目で都道府県と項目に対して繰り返しを行い,20行目で各都道府県の各項目のデータを参照している.ここでは,市区町村に対して和を取り各都道府県の数を求めたいので,sumメソッドを使用している.(pandasモジュールのDataFrameオブジェクトの実体はnumpyモジュールのndarray配列であるため,ndarray配列で使用した関数やメソッドは同じように使える.)
SSDSE-2019Aの一部のデータを棒グラフとして表示
では,以上で取り出したデータを棒グラフとして表示してみよう.
23行目から29行目で,取り出したデータを2次元のリストとして保存し,最終的にndarrayオブジェクトに変換している.40,41行目で取り出したデータを棒グラフとして表示している.この例では都道府県名や項目名が日本語となるため,6,7行目と31行目から33行目までに日本語を表示するための設定を記述している.
以上の例では,各都道府県の総人口が異なるために,都道府県間でデータを比較することが難しくなっている.各都道府県の総人口で正規化するには,以下のようにすればよい.
22行目で正規化するデータ項目を指定し,31行目で正規化を行い,62,63行目で正規化したデータを棒グラフとして表示している.
SSDSE-2020Bデータの読み込み
次に,時系列データであるSSDSE-2020Bのcsvファイルをダウンロードし,データを読み込んでみよう.
7行目から12行目でSSDSE-2020Bのcsvファイルをダウンロードしている.ダウンロードしたファイルを開くとわかるが,0列目が年度,1列目が地域コード,2列目が都道府県となっている.ここでは,2列目の都道府県を大分類・0列目の年度が小分類として,14行目のようにMultiIndexとして読み込んでいる.また,0行目が各項目のコード,1行目が各項目の日本語表記となっている.ここでは,14行目のように1行目の各項目の日本語表記を列名として読み込んでいる.
また,SSDSE-2020Bのxlsxファイルを使用したい場合には,以下のようにすればよい.
SSDSE-2020Bの一部のデータの取り出し
では,このデータの中から一部のデータを取り出してみよう.例えば,東京都・埼玉県・千葉県・神奈川県の保育所等数・保育所等保育士数・保育所等利用待機児童数・保育所等在所児数のデータを取り出すには以下のようにすればよい.
16,17行目で取り出したい都道府県の項目をリストとして表現している.18,19行目で都道府県と項目に対して繰り返しを行い,20行目で各都道府県の各項目のデータを参照している.元データのindexである年度が降順(2017, 2016, 2015, …)となっているため,sort_indexメソッドを使用して,昇順(2006, 2007, 2008, …)にしている.
SSDSE-2020Bの一部のデータを折れ線グラフとして表示
では,以上で取り出した時系列データを折れ線グラフとして表示してみよう.
23行目から30行目で,取り出したデータを2次元のリストとして保存し,最終的にndarrayオブジェクトに変換している.38行目から41行目で取り出した時系列データを折れ線グラフとして表示している.
課題
課題0
40名の学生の5教科(英語・数学・国語・理科・社会)のテストの点数からなるDataFrameオブジェクトを作り,csvファイルに書き出し,csvファイルから読み込め.
課題1
1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数からなるDataFrameオブジェクトを作り,csvファイルに書き出し,csvファイルから読み込め.
課題2
1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,csvファイルに書き出し,csvファイルから読み込め.
課題3
1クラスの学生数が40名(0-39)のクラスが4クラス(A,B,C,D)あり,それぞれの学生の5教科(英語・数学・国語・理科・社会)のテストの点数3回分からなるDataFrameオブジェクトを作り,xlsxファイルに書き出し,xlsxファイルから読み込め.
課題4
学籍番号をindexとし,氏名・メールアドレス・電話番号からなる名簿のDataFrameオブジェクトと,学籍番号をindexとし,英語のテストの点数・数学のテストの点数・国語のテストの点数からなる成績表のDataFrameオブジェクトを作り,1つのxlsxファイルに書き出し,xlsxファイルから読み込め.
課題5
SSDSE-2019Aデータにおける東京都・埼玉県・千葉県・神奈川県の核家族世帯数・単独世帯数・65歳以上の世帯員のいる核家族世帯数・高齢夫婦のみの世数帯・高齢単身世帯数(65歳以上の者1人)を棒グラフで表し,比較せよ.
課題6
SSDSE-2019Aデータにおける東京都・大阪府・青森県・佐賀県の15歳未満人口・15~64歳人口・65歳以上人口・75歳以上人口を棒グラフで表し,比較せよ.
課題7
SSDSE-2019Aデータにおける埼玉県川越市・鶴ヶ島市・ふじみ野市・志木市の幼稚園数・小学校数・中学校数・高等学校数を棒グラフで表し,比較せよ.
課題8
SSDSE-2020Bデータにおける東京都・埼玉県・千葉県・神奈川県の各年度の新規求職申込件数(一般)・月間有効求職者数(一般)・月間有効求人数(一般)・就職件数(一般)を折れ線グラフで表し,比較せよ.
課題9
SSDSE-2020Bデータにおける東京都・大阪府・愛知県・神奈川県の各年度の幼稚園在園者数・小学校児童数・中学校生徒数・高等学校生徒数を折れ線グラフで表し,比較せよ.