読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

Python Pandasをさわってみる(4)



いよいよPandasっぽい操作をすることができるのか。どうなのか。

前回の記事で、返還後のCSVを無事Pandasで読み込めた

osa030.hatenablog.com

今回は読み込んだデータを元にあれこれしてみる。

動作環境

環境

OS Windows 8.1(64bit)
Python 2.7.9(32bit)
Pandas 0.16.2

対象データ

政府が公開している統計データEXCELファイルを変換したCSVファイル。フォーマットは以下。

year 西暦
prefecture 都道府県名
young 0-14歳の人口
adult 15-64歳の人口
elder 65歳以上の人口

詳細は、以下の記事を参照

osa030.hatenablog.com

以下は全部「ipython」での実行。Pandasの詳細は以下を参考にした。

pandas: powerful Python data analysis toolkit — pandas 0.16.2 documentation

列を追加してみる

CSVを読み込んだDataFrameに列を追加してみる。

In [1]: import pandas as pd
In [2]: df = pd.read_csv("./1970-2014.csv")

総人口列

生データは「young」「adult」「edler」の三区分で人口数が存在しているんだけど、それを合計した総人口値を新たな列としてDataFrameに追加してみる。

  • 総人口列の追加
In [3]: df['total'] = df.young + df.adult + df.elder
  • 確認
In [4]: df.head(5)
Out[4]:
   year prefecture young adult elder        total
0  1970        北海道  1309  3576   299  13093576299
1  1971        北海道  1302  3577   309  13023577309
2  1972        北海道  1302  3580   323  13023580323
3  1973        北海道  1308  3588   336  13083588336
4  1974        北海道  1316  3611   352  13163611352

あれ?なんか違う。

どうやら文字列として連結されているようだ。DataFrameのカラムの型を見てみる。

  • 型の確認
In [6]: df.dtypes
Out[6]:
year           int64
prefecture    object
young         object
adult         object
elder         object
total         object
dtype: object

「year」はint64となっているけど、それ以外はObject扱いになってる。「prefecture」は都道府県名なので整数型にならないのはわかるのだけれども。それ以外はなんでだろうなあ、ということで調べてみよう。

In [7]: df[df.young == '-']
Out[7]:
      year prefecture young adult elder total
1380  1970        沖縄県     -     -     -   ---
1381  1971        沖縄県     -     -     -   ---

なるほど。データが存在しない年度には「-」が入っているのでそれは数字に変換できないのでObject扱いとなっているのか。ではそれを除外すればいいのか。

  • 読込時に'-'をNaNとする
In [8]: df = pd.read_csv("./1970-2014.csv",na_values='-')
  • 型の確認
In [9]: df.dtypes
Out[9]:
year            int64
prefecture     object
young         float64
adult         float64
elder         float64
dtype: object

成功。ちなみに先程のデータはどうなっているのかというと、

In [10]: df[df.prefecture == '沖縄県'].head(2)
Out[10]:
      year prefecture  young  adult  elder
1380  1970        沖縄県    NaN    NaN    NaN
1381  1971        沖縄県    NaN    NaN    NaN

「NaN」ということでしょう。
うん、これで文字ではないので多分問題なかろう。もう一度総人口列を作ろう

  • 総人口列の追加/列の型の確認
In [13]: df['total'] = df.young + df.adult + df.elder

In [14]: df.dtypes
Out[14]:
year            int64
prefecture     object
young         float64
adult         float64
elder         float64
total         float64
dtype: object
  • 追加された総人口列の確認
In [15]: df.head(5)
Out[15]:
   year prefecture  young  adult  elder  total
0  1970        北海道   1309   3576    299   5184
1  1971        北海道   1302   3577    309   5188
2  1972        北海道   1302   3580    323   5205
3  1973        北海道   1308   3588    336   5232
4  1974        北海道   1316   3611    352   5279

はい、いけました。

高齢化率列

今度は調子にのって「高齢化率」を求めてみよう。高齢化率は単純に以下の式で出すことにする。

高齢化率(こうれいかりつ)とは、65歳以上の高齢者人口(老年人口)が総人口に占める割合のこと。

高齢化率 - Wikipedia

で、高齢化率の計算は

高齢化率は以下の計算により算出しています。
高齢化率(%)= 高齢者人口 ÷(総人口-年齢不詳人口)× 100

高齢化率の算出方法について教えてください。/千葉県

らしいのだけれども、年齢不詳人口がデータにないから以下としている。

高齢化率 = 65歳以上の人口 ÷ 総人口 × 100

  • 高齢化率列の追加/列の型の確認
In [16]: df['aging'] = (df.elder / df.total * 100).round(2)
In [17]: df.dtypes
Out[17]:
year            int64
prefecture     object
young         float64
adult         float64
elder         float64
total         float64
aging         float64
dtype: object
  • 追加された高齢化率の確認
In [18]: df.head(5)
Out[18]:
   year prefecture  young  adult  elder  total  aging
0  1970        北海道   1309   3576    299   5184   5.77
1  1971        北海道   1302   3577    309   5188   5.96
2  1972        北海道   1302   3580    323   5205   6.21
3  1973        北海道   1308   3588    336   5232   6.42
4  1974        北海道   1316   3611    352   5279   6.67

こんな感じでデータを加工できるわけだね。

データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)

データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)

  • 作者: 佐藤洋行,原田博植,下田倫大,大成弘子,奥野晃裕,中川帝人,橋本武彦,里洋平,和田計也,早川敦士,倉橋一成
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/08/08
  • メディア: 大型本
  • この商品を含むブログ (10件) を見る

スポンサーリンク