法務省の出入国管理の統計データをとってきて、処理するnotebok の単純版をつくりました。
コメントをいっぱいかいていますが、クラス化などしていないので、改造するには便利だと思います。
jupyter のコードを下記にはりつけておきます。
# 最小限のライブラリ設定をします。
import pandas as pd # pandas というデータ処理ライブラリの読み込み
import re # 正規表現用
from IPython.display import display, HTML # 表示用のライブラリ読み込み
# エクセルデータをとってきて、pandas に入れ込みます。これだけでオッケー
# もとのエクセルが、シート1枚の前提です。
moto= pd.read_excel('http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_xlsDownload_&fileId=000007747517&releaseCount=1')
# 年月日は、2016 8 になっているので、追加情報として、year,month を設定します。(スクロールして自動的にとってくるのがいいいですね。)
year = 2016
month = 8
# まず、総数の確認
count_all = int(moto.iloc[2,3])
# 総数の確認 ( count_all は整数なので、文字列にして表示して、HTML として、表示 display します。)
display(HTML('<h1> 総数 = ' + str(count_all) + '<h1>'))
# moto.head() とすると、データの最初の5行がさくっとみることができます。
# セルの一番最後の実行行の結果は表示されます。print(moto.head()) とかしないでも大丈夫です。
# 集計するときに、余計な行や列があるのがわかります。
moto.head()
# columns 情報 最初の1行の5番目(釧路)からの港湾名をとってきます。
columns = moto.iloc[1,4:]
# とってきただけでは、改行がはいっていたり、いろいろ難ありです。
display(columns[12:18])
# index が、Unnamed: 16 になっていて、わかりにくいので、連番に変更します。見た目だけの問題なので、やらなくてもよいです。
columns.index = range(0,len(columns))
display(columns[12:18])
# 改行、空白,などを取り除きます。
columns = columns.apply(lambda x: x.replace("\n",'').replace(' ',''))
display(columns[12:18])
# index (国)を作成します。(つくらなくてもいいのですが、行データ削除で便利なのでつけます。)
idx = moto.iloc[3:,1]
# 改行、空白,などを取り除きます。
idx = idx.apply(lambda x: x.replace("\n",'').replace(' ',''))
display(idx[12:18])
# 国(country)、港湾(port),入国者数(num) の整形されたデータを作成します。
# まずは、空データの作成です。
xdf = pd.DataFrame(columns=['country','port','num'])
# 縦に並べる country,port,num
for i in range(0,len(columns)):
x = pd.DataFrame(idx)
x.columns = ['country']
x['port'] = columns[i]
x['num'] = moto.iloc[4:,4 + i]
x.index = idx
x.index.name = 'country'
xdf = xdf.append(x)
display(xdf.head(210).tail(10))
# 地域別の小計を取り除きます 小計のところが、NaN (データがない状態)になっています。
area = ['アジア', 'ヨーロッパ','アフリカ', '北アメリカ', '南アメリカ', 'オセアニア']
# index をつかって、削除をしています。検索で指定するよりらくです。inplace=True の指定をしてxdf を直接書き換えしています。
xdf.drop(area,inplace=True)
display(xdf.head(210).tail(10))
# 年、月の項目を足します。
xdf['year'] = year
xdf['month'] = month
display(xdf.head(210).tail(10))
# 確認のために総数を計算
display(HTML('<h1>' + str(xdf['num'].sum()) + '</h1>'))
# 整形したのを、excel ファイルに保存します。
xdf.to_excel('immigration.xlsx')