実現したいこと
・一行に線区、駅名、徒歩、線区、駅名、徒歩のように、線区、駅名、徒歩の情報が複数個ある場合(一個しかない場合もあり)に、正規表現にて最初に駅名だけを抽出したいのですが、何度やっても一部分がうまく抽出できません。
徒歩や線区はうまく抽出できたので、それに習って行ってみてもうまく抽出できず、悩んでいます。
前提
python3にてvscodeで行っております。
正規表現を用いて最初の「徒歩○○分」までの文字列を抽出し、その後ろは抽出しない。新しいカラム「アクセス1」に格納
train['アクセス1'] = train['アクセス'].str.extract('(.?徒歩\d+分)') #正規表現を用いて最初の「徒歩○○分」までの文字列を抽出
test['アクセス1'] = test['アクセス'].str.extract('(.?徒歩\d+分)') #正規表現を用いて最初の「徒歩○○分」までの文字列を抽出
train["アクセス"] #大元のデータ
↓
0 都営三田線西巣鴨駅徒歩4分埼京線板橋駅徒歩14分都電荒川線西ケ原四丁目駅徒歩7分
1 都営大江戸線勝どき駅徒歩5分有楽町線月島駅徒歩9分日比谷線築地駅徒歩20分
2 京王線笹塚駅徒歩6分京王線代田橋駅徒歩7分京王線明大前駅徒歩17分
3 総武線・中央線(各停)高円寺駅徒歩9分丸ノ内線(池袋-荻窪)新高円寺駅徒歩3分丸ノ内線(池袋...
4 京成金町線京成金町駅徒歩5分常磐線金町(東京都)駅徒歩7分京成金町線柴又駅徒歩17分
...
31463 都営三田線蓮根駅徒歩7分都営三田線西台駅徒歩10分都営三田線志村三丁目駅徒歩17分
31464 東急田園都市線三軒茶屋駅徒歩6分東急世田谷線西太子堂駅徒歩4分小田急小田原線世田谷代田駅徒歩13分
31465 東西線南砂町駅徒歩5分都営新宿線大島(東京都)駅徒歩26分東西線東陽町駅徒歩18分
31466 中央線(快速)中野(東京都)駅徒歩4分丸ノ内線(池袋-荻窪)新中野駅徒歩10分丸ノ内線(池袋...
31467 有楽町線千川駅徒歩5分有楽町線要町駅徒歩13分西武池袋線東長崎駅徒歩17分
train["アクセス1"] #最初の徒歩○○分までのデータを抽出
↓
0 都営三田線西巣鴨駅徒歩4分
1 都営大江戸線勝どき駅徒歩5分
2 京王線笹塚駅徒歩6分
3 総武線・中央線(各停)高円寺駅徒歩9分
4 京成金町線京成金町駅徒歩5分
...
31463 都営三田線蓮根駅徒歩7分
31464 東急田園都市線三軒茶屋駅徒歩6分
31465 東西線南砂町駅徒歩5分
31466 中央線(快速)中野(東京都)駅徒歩4分
31467 有楽町線千川駅徒歩5分
該当のソースコード
python3
1# 正規表現を用いて最初の「徒歩○○分」までの文字列を抽出し、その後ろは抽出しない。新しいカラム「アクセス1」に格納 2train['アクセス1'] = train['アクセス'].str.extract('(.*?徒歩\d+分)') 3test['アクセス1'] = test['アクセス'].str.extract('(.*?徒歩\d+分)') 4 5# 駅名を抽出する関数 6def extract_station(access_string): 7 if pd.isnull(access_string): 8 return None 9 # 「何か線」に続く最初の駅名を抽出する正規表現 10 match = re.search(r"線(.*?)駅", access_string) 11 if match: 12 # 駅名が見つかった場合は、その駅名を返す 13 return match.group(1) + '駅' 14 else: 15 # 駅名が見つからなかった場合はNoneを返す 16 return None 17 18# 'アクセス1'カラムから駅名を抽出して'最寄り駅'カラムに格納 19train['最寄り駅'] = train['アクセス1'].apply(extract_station) 20test['最寄り駅'] = test['アクセス1'].apply(extract_station) 21 22 23print(train["最寄り駅"].isna().sum()) ⇒1667 (この数だけ、関数が適用されていないことが分かります) 24 25 26set(train["最寄り駅"]) - set(test["最寄り駅"]) 27⇒{'三ノ輪橋駅', 28 '上野広小路駅', 29 '京成上野駅', 30 '吉祥寺駅', 31 '大塚駅', 32 '川崎駅', 33 '栄町(東京都)駅', 34 '梶原駅', 35 '町屋二丁目駅', 36 '町屋駅', 37 '西武新宿駅', 38 '(快速)神田(東京都)駅', 39 '-東海道本線)赤羽駅', 40 '-横須賀線)大崎駅'} 41 42これらを抽出したいのですが、うまくいかないです。。
試したこと
def extract_station(access_string): # 特殊な駅名に対するリストを更新 special_stations = [ '三ノ輪橋駅', '上野広小路駅', '京成上野駅', '吉祥寺駅', '大塚駅', '川崎駅', '栄町(東京都)駅', '梶原駅', '町屋二丁目駅', '町屋駅', '西武新宿駅', '神田(東京都)駅', '赤羽駅', '大崎駅'] for station in special_stations: if station in access_string: return station # 一般的な「何か線」に続く最初の駅名を抽出する正規表現 match_other = re.search(r"線[\s\S]*?([^\s\-()\(\)]*?)駅", access_string) if match_other: return match_other.group(1) + '駅' else: return None # 'アクセス1'カラムから駅名を抽出して'最寄り駅'カラムに格納 train['最寄り駅'] = train['アクセス1'].apply(extract_station) test['最寄り駅'] = test['アクセス1'].apply(extract_station) print(train["最寄り駅"].isna().sum()) #重複の確認 set(train["最寄り駅"]) - set(test["最寄り駅"]) ↓ 1667 {'三ノ輪橋駅', '上野広小路駅', '京成上野駅', '川崎駅', '栄町(東京都)駅', '梶原駅', '町屋二丁目駅', '町屋駅', '西武新宿駅'} # 'アクセス1'カラムから駅名を抽出して'最寄り駅'カラムに格納 train['最寄り駅'] = train['アクセス1'].apply(extract_station) test['最寄り駅'] = test['アクセス1'].apply(extract_station) #最寄り駅のカラムに抽出できない値が存在しているか念のため確認。 train[train["最寄り駅"] == "三ノ輪橋駅"]↓
区 アクセス1 線区 最寄り駅 徒歩時間 賃料面積比対数(見にくい為、カラムを一部割愛)
19 都電荒川線三ノ輪橋駅徒歩3分 57 三ノ輪橋駅 3 7.802321
補足情報(FW/ツールのバージョンなど)
vscode
バージョン: 1.86.2 (user setup)
コミット: 903b1e9d8990623e3d7da1df3d33db3e42d80eda
日付: 2024-02-13T19:40:56.878Z
Electron: 27.2.3
ElectronBuildId: 26908389
Chromium: 118.0.5993.159
Node.js: 18.17.1
V8: 11.8.172.18-electron.0
OS: Windows_NT x64 10.0.22621
python3 インタープリタ3.11.4

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/02/20 09:46
2024/02/20 14:16
2024/03/18 13:16