01.7.6
住所を都道府県・市区町村に分割する
startswith で先頭一致させ、市区町村は残りの文字列から「市」「区」「町」「村」が最初に現れる位置までを切り出します。辞書もライブラリも使わない 40 行ほどの関数ですが、地域別の集計や配送エリアの判定に必要な prefecture 列と city 列が得られます。政令指定都市の区や「市川市」のような市名には弱いので、その限界も合わせて確認します。直感 #
請求書やアンケートの住所は 1 列の文字列として届きますが、集計で欲しいのは「都道府県ごとの件数」や「市区町村ごとの配送コスト」です。住所の先頭は必ず都道府県なので、47 件の一覧と前から比べれば 1 つに決まります。その後ろは「千代田区」「宗像市」のように行政区の名前が「市・区・町・村」のどれかで終わるので、その文字が最初に出た位置で切れば市区町村が取れます。残った「霞が関1-1-1 ○○ビル3F」は番地と建物名で、ここは今回は分けずにそのまま持ちます。
Python で分割する #
次のコードは 47 都道府県のリストを持ち、split_address が prefecture・city・remaining の 3 つのキーを持つ辞書を返します。3 件のサンプルのうち 1 件は政令指定都市の住所で、この関数の限界が見えるようにしてあります。
| |
実行結果の読み方 #
1 件目と 3 件目は意図どおりに city が「千代田区」「宗像市」になります。2 件目の「大阪府大阪市北区梅田3丁目1-1」は city が「大阪市」で止まり、「北区」は remaining の先頭に残ります。政令指定都市を区まで分けたいなら、remaining に対してもう一度「区」で切る処理を足すか、市区町村の一覧との最長一致に切り替えます。都道府県が見つからない住所は prefecture が空文字になるので、== "" でフィルタして件数を確認する習慣をつけてください。
使いどころと落とし穴 #
政令指定都市の区や郡部(「○○郡△△町」)に正しく対応するには、総務省の全国地方公共団体コード(JIS X 0401・X 0402)をダウンロードし、市区町村名の一覧を作ったうえで最長一致に切り替えるのが確実です。この関数は「市」が最初に出た位置で切るので、「千葉県市川市」のように市名の先頭に「市」を含む住所では city が「市」だけになり、一覧との最長一致ならこの誤りは起きません。町名以降の remaining を緯度経度に直したい場合は、geopy や国土地理院のジオコーディング API に prefecture + city + remaining を渡します。郵便番号が付いている住所なら、日本郵便の郵便番号 CSV をマスタにして住所を引き直すと、誤字の修正とローマ字表記の付与も同時に行えます。