44933


「徒歩分数」と「電車の乗車時間」が混在したデータがあります。  
徒歩分数のみを取り出して、それ以外は欠損値とする、  
新たなデータを作成したいと考えています。

[code]

    y: [4, NaN, 5]
    
[/code]

現在は「分」を取り除く所までですが、以下のようになっています。  
どなたか、ご教示頂けるとありがたいです。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        {'x': ['徒歩４分', '2駅12分', '約5分']},
        index=[1, 2, 3])
    
    df["walk_time"] = df.x.str.extract(r'(\d*)分')
    
[/code]


CC BY-SA 4.0
2018-06-20T06:56:34.437
44909
2018-06-21T01:38:10.353
2018-06-20T07:24:26.060
3060
20148
question
python
正規表現を用いた、不規則な文字列からの数値の抽出


データの表現の幅が広そうなので、pandasのcontainsやextractを駆使するよりも[map](https://pandas.pydata.org/pandas-
docs/stable/generated/pandas.Series.map.html)や[applymap](https://pandas.pydata.org/pandas-
docs/stable/generated/pandas.DataFrame.applymap.html)で関数を呼び出して柔軟に数値を抽出するのが望ましいと思います。

全角数字を半角に変換する処理のため、zenhanモジュールを使っています。  
`pip install zenhan`でインストールするか、mojimojiなど他のモジュールを使う場合は読み替えてください。

要件を読み取れなかったので、下記のサンプルコードでは「徒歩」または「約」から始まる文字列のみ徒歩扱いで判定しています。  
「１００分」や「東京駅から徒歩1分」は徒歩扱いになりませんので、必要に応じて`get_walk_time`関数のif文などを修正してください。

[code]

    import re
    import pandas as pd
    import zenhan
    
    def get_walk_time(s):
        s = zenhan.z2h(s)
        if not re.match('(徒歩|約)', s):
            return None
        m = re.search('(\d+)分', s)
        return m.group(1)
    
    df = pd.DataFrame(
        {'x': ['徒歩４分', '2駅12分', '約5分', '１００分', '東京駅から徒歩1分']},
        index=[1, 2, 3, 4, 5])
    
    df["walk_time"] = df.x.map(get_walk_time)
    print(df.walk_time) # [4, None, 5, None, None]
    
[/code]


CC BY-SA 4.0
2018-06-21T01:21:35.897
44933
2018-06-21T01:38:10.353
2018-06-21T01:38:10.353
9820
9820
44909
answer