交通アクセスの情報から徒歩分数の数値のみを取り出す方法

投稿者: Anonymous

ホテルのアクセス状況にある、最寄り駅からの「徒歩分数」から、徒歩分数の数値を取得したいと考えています。
徒歩分数の数値のみを取り出して、それ以外は欠損値とする、
新たなデータを作成したいと考えています。

import re
import pandas as pd
import zenhan # 全角半角を修正するモジュール

df = pd.DataFrame(
    {'x': ['交通アクセスJR神田駅より徒歩4分', 
           '交通アクセス東京駅1駅2分、東京ディズニーリゾート(R)2駅12分◆八丁堀駅A2・A3出口から徒歩3分◆銀座・有楽町へアクセス良好!', 
           '交通アクセス東京駅より徒歩3分(八重洲中央口より)、羽田空港よりリムジンバスで30分、成田空港よりJRエクスプレスで60分。', 
           'アクセス:JR東京駅から3駅7分「潮見駅」(東口)からすぐ右手正面TDR・TDL「JR舞浜」まで3駅8分駐車場:敷地内45台1泊1,500円先着順予約不可駐車台数に限りがある為、極力公共交通機関をご利用下さい', 
           'アクセス:JR神田駅・営団地下鉄銀座線神田駅徒歩2分駐車場:なし']})

def get_walk_time(s):
    s = zenhan.z2h(s)
    if not re.match(r'(徒歩|約)', s):
        return None
    m = re.search(r'(d+)分', s)
    return m.group(1)

df["walk_time"] = df.x.map(get_walk_time)
print(df.walk_time)

現在は次のような結果になっています。

0 None
1 None
2 None
3 None
4 None

次のようなデータを作成したいと考えています。
0 4
1 3
2 3
3 None
4 2

よろしくお願いいたします。

解決

re.matchは文字列の先頭がパターンにマッチするかどうかなのですべてNoneになります。次のように修正したらどうでしょうか。

def get_walk_time(s):
    m = re.search(r'(徒歩|約)(d+)分', s)
    return zenhan.z2h(m.group(2)) if m else None

なお、Python3では、dは全角の数値にもマッチするので上のように変更してみました。他との互換性を考えるとzenhan.z2h()で半角に変換後でもいいと思います。

コメントを参考にすると以下のように簡単になります。数字がfloatNonenumpy.nanになりますがこちらを使うほうが通常は便利です。

df = pd.DataFrame(
    {'x': ['交通アクセスJR神田駅より徒歩4分', 
           '交通アクセス東京駅1駅2分、東京ディズニーリゾート(R)2駅12分◆八丁堀駅A2・A3出口から徒歩3分◆銀座・有楽町へアクセス良好!', 
           '交通アクセス東京駅より徒歩3分(八重洲中央口より)、羽田空港よりリムジンバスで30分、成田空港よりJRエクスプレスで60分。', 
           'アクセス:JR東京駅から3駅7分「潮見駅」(東口)からすぐ右手正面TDR・TDL「JR舞浜」まで3駅8分駐車場:敷地内45台1泊1,500円先着順予約不可駐車台数に限りがある為、極力公共交通機関をご利用下さい', 
           'アクセス:JR神田駅・営団地下鉄銀座線神田駅徒歩2分駐車場:なし']})

df["walk_time"] = df.x.str.extract('(徒歩|約)(d+)分')[1].astype(float)
print(df.walk_time)
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *