Haru57636433
@Haru57636433 (haru .)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Dataframe内の住所から都道府県を抽出したい

解決したいこと

Dataframe内の
”住所”列から 都道府県名だけを抜き出し、”都道府県”の列に張り付けたい

発生している問題・エラー

print(df.columns)
print(df.dtypes)
print(df.isnull().sum())

//以下return内容
Index(['店舗コード', '店舗名', '店舗名カナ', '紹介文', '条件等', '分類', '電話番号', '都道府県', '住所',
       'アクセス・道案内', '営業時間', '定休日', '支払い方法', 'お店のホームページ', 'カット価格', '設備/席数',
       'スタッフ数', '駐車場', 'こだわり条件', '備考', 'ページURL'],
      dtype='object')
店舗コード        object
店舗名          object
店舗名カナ        object
紹介文          object
条件等          object
分類           object
電話番号         object
都道府県         object
住所           object
アクセス道案内     object
営業時間         object
定休日          object
支払い方法        object
お店のホームページ    object
カット価格        object
設備席数        object
スタッフ数        object
駐車場          object
こだわり条件       object
備考           object
ページURL       object
dtype: object
店舗コード            0
店舗名             10
店舗名カナ           10
紹介文             10
条件等           1010
分類               6
電話番号         14008
都道府県             0
住所               0
アクセス道案内        15
営業時間            15
定休日             15
支払い方法           21
お店のホームページ    29690
カット価格           15
設備席数           15
スタッフ数           15
駐車場             15
こだわり条件          20
備考           22035
ページURL          15
dtype: int64

住所のカラムには、
北海道札幌市北区○○ ○○ビル○○
というように普遍的な住所内容が入っております

該当するソースコード

# 都道府県の抽出する正規表現パターンをつくる
pattern = '東京都|北海道|(京都|大阪)府|.{2,3}県'
# 都道府県を抽出する
df['都道府県'] = df['住所'].apply(lambda x:re.match('東京都|北海道|(?:京都|大阪)府|.{2,3}県', x).group())
df
# エラー内容
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-88-bbe03f77542f> in <module>()
      1 # 都道府県を抽出する
----> 2 df['都道府県'] = df['住所'].apply(lambda x:re.match('東京都|北海道|(?:京都|大阪)府|.{2,3}県', x).group())
      3 df

1 frames
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-88-bbe03f77542f> in <lambda>(x)
      1 # 都道府県を抽出する
----> 2 df['都道府県'] = df['住所'].apply(lambda x:re.match('東京都|北海道|(?:京都|大阪)府|.{2,3}県', x).group())
      3 df

AttributeError: 'NoneType' object has no attribute 'group'

自分で試したこと

最初は住所に欠損値があったので、
df['住所'] = df['住所'].fillna("住所情報無し")
という形で補完したりしたのですが、結果は変わらず、無いと言われてしまっております。

どの部分が誤ってしまっているのでしょうか。

宜しくお願い致します。

0

1Answer

正規表現にマッチしなかった場合にgroupを取ろうとするとエラーとなります。
image.png

回避策としては、マッチしなかった場合を考慮した関数を用意してapplyで適用してあげるやり方などが考えられると思います。

import pandas as pd
import re

def get_prefectures(address):
    m = re.match('東京都|北海道|(?:京都|大阪)府|.{2,3}県', address)
    if m:
        return m.group()
    else:
        return address

df = pd.DataFrame()
df['住所'] = ['北海道札幌市','東京都江東区','大阪府貝塚市','福岡県博多区','住所情報無し']
df['都道府県'] = df['住所'].apply(get_prefectures)

image.png

0Like

Comments

  1. @Haru57636433

    Questioner

    なるほど、そういうことなんですね。
    無事実行して想定通りの結果を得ることが出来ました!
    ありがとうございました!

Your answer might help someone💌