Pythonで、e-Statの市区町村別の人口、面積、年齢データをCSVに変換する
本日はちょっとPython篇。なぜっていうと、Pythonしか使えないよーって人がいるから。こういうテーブルを加工する系はR(というかdplyr)のほうが断然使いやすいとは思いますが、まあバイリンガルになるのも良いでしょう。
例えば、欲しいのは市区町村別の人口や面積や平均年齢のデータ。で、e-Statに置いてあるのを発見するも(国勢調査 都道府県・市区町村別の主な結果 都道府県・市区町村別の主な結果 | ファイル | 統計データを探す | 政府統計の総合窓口)、ファイルがエクセルだわ、列名が自治体コードと都道府県名を連結した文字列だわで、なんとも使いづらい。ちゃちゃっと加工しちゃえばいいんでしょうが、全国のいろんなところで、いろんな人が同じような作業をするのが無駄なので、サンプルコードとそれで出力されたCSVファイルを置いておきます。
やっているのは、
- "openpyxl"でエクセルファイルを読み込みデータフレームに変換
- 必要な行や列を取り出す
- 正規表現で列名を加工
- CSVファイルに書き出し
import os import openpyxl import pandas as pd os.chdir(r'(エクセルファイルを置いたパス)') # ワークブックを開いた後、ワークシートを指定する # 読み込んでいるのは、e-Statの国勢調査データ wb = openpyxl.load_workbook('major_results_2020.xlsx') ws = wb['第1面事項_2020年'] df = pd.DataFrame(ws.values) # データが入っているのは9行目以降 # 0, 1, 4, 10, 11, 12列にはそれぞれ # 都道府県、市区町村、人口、面積、平均年齢が入っている df = df.loc[9:, [0, 1, 4, 10, 12]] dic = {0:'都道府県', 1:'市区町村', 4:'人口', 10:'面積', 12:'平均年齢'} df = df.rename(columns=dic) # 列名をつける # アンダースコアの前の部分が、 # 全国地方公共団体コード(5桁)らしいので、 # 正規表現で、任意の文字「.」の1文字以上の繰り返し「+」を抽出する。 # 括弧の中が抽出される df['コード'] = df['市区町村'].str.extract('(.+)_') # 扱いやすいように、コードの数値部分は削除して、 # 都道府県名、市区町村名は列名は文字列のみにしておく df['都道府県'] = df['都道府県'].str.extract('_(.+)') df['市区町村'] = df['市区町村'].str.extract('_(.+)') # 列の順番の変更 df = df[['都道府県', '市区町村', '人口', '面積', '平均年齢']] # CSVファイルへ出力 df.to_csv('市区町村別の人口と面積と平均年齢.csv', index = False)
上記のコードで出力されたCSVがこれになります。
コメント
コメントを投稿