0
1

【Python】住所から郵便番号を特定しちゃおう

Posted at

はじめに

マーケティングの会社で働くデータサイエンティストのRyo_kinaです。

ある日、こんな相談を受けました💡
 ダイレクトメールを送りたい!
 宛名と住所一覧はあるけど、郵便番号がない!
 ⇒15,000件くらいあって、なんとかならない??

それくらい、すぐつけれるっしょ! Qiitaさ~ん!と思って調べてみると、出てくるのは
「郵便番号を住所に変換する方法」ばかり・・・

世の中、住所がわかる=郵便番号もわかる のケースが多数派なのか・・・( ;∀;)

試行錯誤の結果

こちらのAPIは
住所を投げると、郵便番号候補を返してくれる
という、とっても素敵なAPIです✨

(他力でクリアすることにしました。作者様に感謝です!)

APIの利用テスト

Post_transrate.py
# API呼び出し用のrequestsライブラリを準備
!pip install requests

import requests

# 住所⇒郵便番号  住所は前方一致で検索してくれるので、番地のフォーマットが適当でも問題ない。
# 途中の市区町村が間違っていると導出できない。
url = " https://zipcoda.net/api"
payload = {"address": "愛知県名古屋市昭和区鶴舞一丁目1番155号"}
# 名古屋市で最も大きい「鶴舞図書館」の住所を入力

r = requests.get(url, params=payload)

print(r.text)

実行すると、下記のようなアウトプットになります。

'{"status":200,"length":2,"items":[{"zipcode":"4660064","pref":"愛知県","components":["愛知県","名古屋市昭和区","鶴舞"],"address":"名古屋市昭和区鶴舞"},{"zipcode":"4660000","pref":"愛知県","components":["愛知県","名古屋市昭和区"],"address":"名古屋市昭和区"}]}'

ここから、最も可能性が高い郵便番号を取り出すことで、完了です。

r.json()["items"][0]["zipcode"]
# '4660064'

複数住所に、郵便番号を付与する

上記動作を関数にし、Pandasのデータフレームに対して、まとめて動作するようにします。

今回は、例として「名古屋市の図書館を対象いに、住所から郵便番号を検索するコード」を作成します。

import pandas as pd

# データの作成
data_list = [
    {'館名': '鶴舞中央図書館', '郵便番号\u3000正解': '〒466-0064', '所在地': '名古屋市昭和区鶴舞一丁目1番155号'},
    {'館名': '千種図書館', '郵便番号\u3000正解': '〒464-0803', '所在地': '名古屋市千種区田代町字瓶杁1番地の137'},
    {'館名': '東図書館', '郵便番号\u3000正解': '〒461-0047', '所在地': '名古屋市東区大幸南一丁目1番10号'},
    {'館名': '北図書館', '郵便番号\u3000正解': '〒462-0037', '所在地': '名古屋市北区志賀町4丁目60番地の31'},
    {'館名': '楠図書館', '郵便番号\u3000正解': '〒462-0012', '所在地': '名古屋市北区楠二丁目974番地'},
]

# list を DataFrame に変換
data_df = pd.DataFrame(data_list)

# DataFrameを表示
print(data_df)

こんな感じになります。正解付きです。

        館名    郵便番号 正解                   所在地
0  鶴舞中央図書館  〒466-0064    名古屋市昭和区鶴舞一丁目1番155号
1    千種図書館  〒464-0803  名古屋市千種区田代町字瓶杁1番地の137
2     東図書館  〒461-0047     名古屋市東区大幸南一丁目1番10号
3     北図書館  〒462-0037   名古屋市北区志賀町4丁目60番地の31
4     楠図書館  〒462-0012       名古屋市北区楠二丁目974番地

次に、住所を郵便番号に変換する関数 を記載します。

# 住所を渡すと、郵便番号を返してくれるコード
def ret_post(target):
    import time
    import requests
    
    url = " https://zipcoda.net/api"
    payload = {"address": target}

    r = requests.get(url, params=payload)

    time.sleep(0.1) # 連続アクセスによる負荷を抑えるため、0.1秒待つ。
    return r.json()["items"][0]["zipcode"]

# 関数の実行確認
ret_post("名古屋市昭和区鶴舞一丁目1番155号")

# '4660064'

ret_postに、住所を渡すと、郵便番号を返してくれます💡
いい感じですね!

では、最後にデータフレームの所在地列に対して、実行していきましょう。

# apply関数を使用して郵便番号を取得し、新しい列として追加
data_df['郵便番号'] = data_df['所在地'].apply(ret_post)

data_df

image.png

以上のように、無事に郵便番号が付与できているのが確認できました!

注意

"字"が入っていると、うまくいかないケースもあるようです。

image.png

最後に

いかがでしたでしょうか?
無事に、郵便番号を付与することができましたね!

【参考にしたサイト】
・名古屋市図書館の住所一覧
 https://www.library.city.nagoya.jp/guide/map.html
・PythonでWeb APIを叩く
 https://qiita.com/hisshi00/items/9806eceeee2237624222

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1