🏣
郵便番号から住所を取得する
運用保守に携わっているシステムで、利用者の居住地の分析をしたい要件があったので、郵便番号から都道府県や住所を取得する方法について調べてみました。
郵便番号 → 住所への変換
http://zipcloud.ibsnet.co.jp/doc/api のように、 Web API を提供してくれているサービスもありますが、今回は件数が多いため、ローカルで検索できるようにします。
日本郵便のサイトから CSV 形式の郵便番号一覧を取得します。「都道府県一覧」から「全国一括」をダウンロードします。
まず、環境の準備を行います。
python3 -m venv .venv
. .venv/bin/activate
pip install pandas
郵便番号一覧を読み込みます。zip_code_table.groupby(level=0).last()
は、1つの郵便番号に複数の住所が登録されていることがあるため、郵便番号でユニークなレコードにしています。
zip_code_table = df = pd.read_csv(
'ken_all.zip', compression='zip', header=None, quotechar='"', dtype=object, encoding='shift_jis')
zip_code_table.set_index(zip_code_table.columns[2], inplace=True)
zip_code_table = zip_code_table.groupby(level=0).last()
テーブルの中身を確認してみます。
0 1 3 4 5 6 ... 9 10 11 12 13 14
2 ...
0010000 01102 001 ホツカイドウ サツポロシキタク イカニケイサイガナイバアイ 北海道 ... 0 0 0 0 0 0
0010010 01102 001 ホツカイドウ サツポロシキタク キタ10ジヨウニシ(1-4チヨウメ) 北海道 ... 1 0 1 0 0 0
0010011 01102 001 ホツカイドウ サツポロシキタク キタ11ジヨウニシ(1-4チヨウメ) 北海道 ... 1 0 1 0 0 0
0010012 01102 001 ホツカイドウ サツポロシキタク キタ12ジヨウニシ(1-4チヨウメ) 北海道 ... 1 0 1 0 0 0
0010013 01102 001 ホツカイドウ サツポロシキタク キタ13ジヨウニシ(1-4チヨウメ) 北海道 ... 1 0 1 0 0 0
... ... ... ... ... ... ... ... .. .. .. .. .. ..
9998522 06461 99985 ヤマガタケン アクミグンユザマチ キタメ 山形県 ... 0 1 0 0 0 0
9998523 06461 99985 ヤマガタケン アクミグンユザマチ トウヤマ 山形県 ... 0 1 0 0 0 0
9998524 06461 99985 ヤマガタケン アクミグンユザマチ トミオカ 山形県 ... 0 1 0 0 0 0
9998525 06461 99985 ヤマガタケン アクミグンユザマチ スグセ 山形県 ... 0 1 0 0 0 0
9998531 06461 99985 ヤマガタケン アクミグンユザマチ スガサト(ソノタ) 山形県 ... 1 1 0 0 0 0
郵便番号のリストをCSV形式で準備します。
sample.csv
"zip"
"1540001"
"1640011"
"1640011"
"2060802"
"3360032"
"3360032"
"3400005"
... (snip) ...
郵便番号を住所に変換し、CSVで出力します。
df = pd.read_csv('sample.csv', sep=',', dtype=str, encoding='cp932')
for index, row in df.iterrows():
state = '不明'
city = '不明'
addr = '不明'
if row.zip in zip_code_table.index:
state = (zip_code_table.loc[row.zip][6])
city = (zip_code_table.loc[row.zip][7])
addr = (zip_code_table.loc[row.zip][8])
df.at[index, 'state'] = state
df.at[index, 'city'] = city
df.at[index, 'addr'] = addr
df.to_csv('result.csv', encoding="shift-jis")
郵便番号から住所を取得することができました。
Discussion