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がこれになります。

"市区町村別の人口と面積と平均年齢.csv"

コメント

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法