🏣

郵便番号から住所を取得する

2022/07/28に公開

運用保守に携わっているシステムで、利用者の居住地の分析をしたい要件があったので、郵便番号から都道府県や住所を取得する方法について調べてみました。

郵便番号 → 住所への変換

http://zipcloud.ibsnet.co.jp/doc/api のように、 Web API を提供してくれているサービスもありますが、今回は件数が多いため、ローカルで検索できるようにします。

日本郵便のサイトから CSV 形式の郵便番号一覧を取得します。「都道府県一覧」から「全国一括」をダウンロードします。

https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html

まず、環境の準備を行います。

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