DataFrameのファイル入出力

目的

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データにおける東京都・大阪府・愛知県・神奈川県の各年度の幼稚園在園者数・小学校児童数・中学校生徒数・高等学校生徒数を折れ線グラフで表し,比較せよ.