ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

たくさんの住所から郵便番号一括検索 【python + pandas】

今回は、こんな発想の声に対応するガジェットです。 「複数の住所に書類を送ることがありました。送り先のリストには住所はあるのですが、郵便番号がありません。封筒を作成するときにさすがに郵便番号を書かないのはよくないなということで、それぞれ郵便番号をリストに追加することになりました。それで、ネット検索で一つずつ住所を打ち込み郵便番号をコピペするという作業を行いました。まあ、コピペコピペで全然できるのですが、あれ、これって一気にできない??できるんじゃない??」

f:id:kslabo51:20220224191822j:plain

たくさんの住所から郵便番号を一発で取得します

住所のみ与えられているリストを一括で取り込み、その住所の郵便番号を自動で調べリストに記載してcsvを吐き出すというガジェットです。

f:id:kslabo51:20220224192031p:plain

このガジェットでできることはこちら

  • 郵便番号と住所をcsvデータとしてご提供されているAIBISU CorpさんのZip CloudというサイトからデータをDLさせていただいております。(日本郵便のWebサイトで公開されている郵便番号データ)
  • 住所のみ載っているリストから郵便番号を一括で検索しリストに反映CSVで返すことができます。
  • 大量のリストでも対応可能ですので、一つずつ検索するより圧倒的に時間短縮できます。

郵便番号データのダウンロード - zipcloud

 

注意点はこちら

  • ファイル形式をcsvにしております。
  • 住所によっては郵便局で町域の記載がないものがあり、その場合は「別途チェック」という言葉を返します。この場合手動で確認する必要あります。
  • また、丁目で郵便番号が分かれる住所はそれぞれの番号が出るようにしています。こちらも手動で確認する必要があります。

評価(自己)

役立ち度   ★★★★(良し)
効率化    ★★★★(良し)
ミス防止   ★★★(平均)
楽しさ    ★★★(平均)
操作性    ★★(悪い)

設定をcsvにしているので、エクセルの場合変換しないといけない点(コードを書き換えれば対応は可能) 住所によって手動を余儀なくされる住所がある点で操作性を悪いにしております。

 

実行環境

使用環境    csv
使用言語               python
使用ライブラリ   pandas、re

 

今回のコード

検索の元ファイルの作成

# zip-cloudさんのデータ(x-ken-all.csv)を読み込んで整形するコードです。

import pandas as pd

names = ['番号', '上3桁', '郵便番号', '読み(都道府県名)', '読み(市区町村名)', '読み(町域名)', '都道府県名', '市区町村名', '町域名', '他1', '他2', '他3', '他4', '他5', '他6']
data = pd.read_csv('x-ken-all.csv', encoding='shift-jis', names=names)

# 郵便番号を文字列に変更し、5桁表示は頭に00、6桁表示は頭に0をつけ7桁にする
data['郵便番号'] = data['郵便番号'].astype(str)
for i in range(len(data['郵便番号'])):
    if len(data.loc[i, '郵便番号']) == 6:
        data.loc[i, '郵便番号'] = '0' + data.loc[i, '郵便番号']
    elif len(data.loc[i, '郵便番号']) == 5:
        data.loc[i, '郵便番号'] = '00' + data.loc[i, '郵便番号']

# 町域名がないものは(なし)と入れる
data = data.fillna('(なし)')
# 都道府県から町域までを結合して住所という列に追加
data['住所'] = data['都道府県名'] + data['市区町村名'] + data['町域名']
# 列を絞る
data = data[['郵便番号', '住所', '他1', '他2', '他3', '他4', '他5', '他6']]

# 検索元となるデータを出力しておく
data.to_csv('base_data.csv')

 

郵便番号を反映させたリストを作成

# 作業用ファイルに郵便番号を検索し情報を追加するコードです

import re
import pandas as pd

test_data = pd.read_csv('task.csv')
data = pd.read_csv('base_data.csv')

test_data['郵便番号1'] = 'なし'
test_data['郵便番号2'] = 'なし'

# テスト用データの住所を町域までと丁目や番地以降で分ける
sepalate_data = []
for i in test_data['住所'].values:
    sepalate_data.append(re.split('\d', i)[0])
# テスト用のデータに町域までの列を追加
test_data['町域まで'] = sepalate_data
test_data = test_data[['住所', '町域まで', '郵便番号1', '郵便番号2']]

# 元のデータを検索し郵便番号を抜き出す
for i in range(test_data.shape[0]):
    address = test_data['町域まで'][i]
    postcode = data[data['住所']==address]['郵便番号'].values
    if len(postcode) == 0:
        test_data['郵便番号1'][i] = '別途チェック'
    elif len(postcode) == 1:
        test_data['郵便番号1'][i] = postcode[0]
    elif len(postcode) == 2:
        test_data['郵便番号1'][i] = postcode[0]
        test_data['郵便番号2'][i] = postcode[1]

# 郵便番号を記入したcheck済みのデータを吐き出す
test_data.to_csv('checked_data.csv', index=False)