47998
[以前の質問](https://ja.stackoverflow.com/questions/47953/%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%95%B0%E5%AD%97%E3%81%B8%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88)の拡張です。

xに入っている路線名を、辞書line_namesにあるような数字に置き換えたいと考えています。  
しかし、路線名にはJRや都営などが付いたり、つかなかったりなど揺らぎあることが分かりました。

現在用意したcodeでは、完全に一致するもののみ、置き換えます。

用意した辞書と部分的に一致したものを番号に変換し、一致しないものは、欠損値にしたいのですが、  
ご教示頂けるとありがたいです。

```

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        {'x': ['ＪＲ山手線',
               '山手線',
               'ＪＲ総武線',
               '総武線',
               '西武池袋線',
               '都営大江戸線',
              　'大江戸線',
               'ＪＲ中央線',
               '中央線',
               'バス',
               '車']})
    
    line_names = {"山手線":"1",
            "総武線":"2",
            "西武池袋線":"3",
            "都営大江戸線":"4",
            "中央線":"5"}
    
    #get() を使うとデフォルト値を指定できます。
    df['y'] = df.apply(lambda row: line_names.get(row["x"], np.NaN), axis=1)
    
```
CC BY-SA 4.0
2018-08-31T21:08:54.830
47997
2018-09-01T01:02:03.560
20148
question
python pandas
文字列の数字への置き換え:文字列に揺らぎがある場合
関数を作ってこんな感じで書けます。

```

    def get_line(x):
        for l in line_names:
            if l in x :
              return line_names[l]
        return np.NaN
    
    df['y'] = df['x'].map(get_line)
    
```

実際の問題では、`df`に大量のデータがあるので、先に`df['x'].unique()`で`df`内にある路線名を全て抽出して、それの番号を計算して辞書を作っておくと処理が速くなります。
CC BY-SA 4.0
2018-09-01T01:02:03.560
47998
2018-09-01T01:02:03.560
15171
47997
answer