47230


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

[code]

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

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

0 None  
1 None  
2 None  
3 None  
4 None

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

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


CC BY-SA 4.0
2018-08-04T00:02:19.780
47229
2018-08-04T09:01:11.767
20148
question
python 正規表現
交通アクセスの情報から徒歩分数の数値のみを取り出す方法


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

[code]

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

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

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

[code]

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


CC BY-SA 4.0
2018-08-04T00:52:28.813
47230
2018-08-04T09:01:11.767
2018-08-04T09:01:11.767
15171
15171
47229
answer