marcopagot
@marcopagot (Asuka)

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内の文字列を正規表現を用いて抽出したい。

例)
閲覧頂きありがとうございます。python初学者です。
現在、suumoの不動産データを用いて賃貸物件の家賃予測をしようとしています。
まず、築年数の特徴量を作成しようとしているのですが
その段階でエラーが出ています。

データの説明

train

データ

    title   category    address age floor   fee management_fee  deposit gratuity    madori  menseki
0   ドゥトゥールWEST   賃貸マンション   東京都中央区晴海3 \n築7年\n42階建\n   \r\n\t\t\t\t\t\t\t\t\t\t\t33階 22万円    15000    22万円    22万円    1LDK    44.67m2
1   ドゥトゥールWEST   賃貸マンション   東京都中央区晴海3 \n築7年\n42階建\n   \r\n\t\t\t\t\t\t\t\t\t\t\t31階 46万円    -   46万円    46万円    3LDK    100.9m2
2   ドゥトゥールWEST   賃貸マンション   東京都中央区晴海3 \n築7年\n42階建\n   \r\n\t\t\t\t\t\t\t\t\t\t\t42階 57万円    30000    57万円    57万円    4LDK    100.9m2
3   ドゥトゥールWEST   賃貸マンション   東京都中央区晴海3 \n築7年\n42階建\n   \r\n\t\t\t\t\t\t\t\t\t\t\t43階 58万円    20000    58万円    58万円    3LDK    100.9m2
4   ドゥトゥールWEST   賃貸マンション   東京都中央区晴海3 \n築7年\n42階建\n   \r\n\t\t\t\t\t\t\t\t\t\t\t52階 70万円    20000    140万円   70万円    2LDK    80.66m2

上記データのtrain['age']の中から、築年数の数字だけ拾ってきて
新しく['age']カラムを追加したいです。
※後程、同じように['age']カラムから階数を取り出して['max_floor']カラムも作成して追加したいです

まず、pandasの['age']カラムに対して、前6文字までを抽出してSeriesとしました。

 入力

age = train['age'].str[0:5:1]
age.head()

出力

0    \n築7年\n
1    \n築7年\n
2    \n築7年\n
3    \n築7年\n
4    \n築7年\n

この後、正規表現を利用して、ageの中から数字だけ取り出そうと
考えております。

自分で試したこと

age_single = age.str.extract(r'\d', expand = False)

出力

ValueError: pattern contains no capture groups

上記のようなエラーとなってしまいました。。。
何か解決方法をご存知の方がいらっしゃりましたら
ご教示の程宜しくお願い致します。

0

1Answer

正規表現のパターンの箇所に括弧がないのが原因だと思います。
参考:pandas ValueError: pattern contains no capture groups

また、括弧をつけただけだと、2桁の場合先頭の数字しかとってこれません。
以下のようにすれば取ってこれるようになると思います。

age_single = age.str.extract(r'(\d{2}|\d{1})', expand = False)

また築年数と何階建ての部分の表記が常に一定なのであれば、単純にのインデックスを取得して、その間の文字列を取得するだけでも実現できると思います。

def get_age(s):
    start = s.index('')+1
    end = s.index('')
    return s[start:end]

image.png

1Like

Comments

  1. @marcopagot

    Questioner

    @Yottyさん
    回答頂きありがとうございます🙇‍♂️
    また、def関数での説明もありがとうございます、、、涙
    階数も同じようにして取り出そうと思っていたのでありがたいです。
    早速反映させたのですが、下記エラーが出てしまいました。
    解決方法をご存知でしょうか、、
    ※インデントは入ってます!!
    def get_age(s):
    start = s.index('築')+1
    end = s.index('年')
    return s[start:end]
    age = pd.Series(train['age'])
    age = age.map(get_age)
    age
    エラー↓↓
    ValueError: substring not found
  2. おそらく型の問題だと思います。
    関数get_ageの引数は文字列前提で作ってしまっているので、渡された引数が文字列じゃなく
    エラーを吐いているのだと思います。
    文字列型に型変換してあげれば動くと思います。

Your answer might help someone💌