はじめに
マーケティングの会社で働くデータサイエンティストのRyo_kinaです。
ある日、こんな相談を受けました💡
ダイレクトメールを送りたい!
宛名と住所一覧はあるけど、郵便番号がない!
⇒15,000件くらいあって、なんとかならない??
それくらい、すぐつけれるっしょ! Qiitaさ~ん!と思って調べてみると、出てくるのは
「郵便番号を住所に変換する方法」ばかり・・・
世の中、住所がわかる=郵便番号もわかる のケースが多数派なのか・・・( ;∀;)
試行錯誤の結果
こちらのAPIは
住所を投げると、郵便番号候補を返してくれる
という、とっても素敵なAPIです✨
(他力でクリアすることにしました。作者様に感謝です!)
APIの利用テスト
# 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
以上のように、無事に郵便番号が付与できているのが確認できました!
最後に
いかがでしたでしょうか?
無事に、郵便番号を付与することができましたね!
【参考にしたサイト】
・名古屋市図書館の住所一覧
https://www.library.city.nagoya.jp/guide/map.html
・PythonでWeb APIを叩く
https://qiita.com/hisshi00/items/9806eceeee2237624222