web-dev-qa-db-ja.com

pandasデータフレームに正規表現を適用する

pythonデータフレームの列に正規表現関数を適用するのに問題があります。ここに私のデータフレームの先頭があります:

               Name   Season          School   G    MP  FGA  3P  3PA    3P%
 74       Joe Dumars  1982-83   McNeese State  29   NaN  487   5    8  0.625   
 84      Sam Vincent  1982-83  Michigan State  30  1066  401   5   11  0.455   
 176  Gerald Wilkins  1982-83     Chattanooga  30   820  350   0    2  0.000   
 177  Gerald Wilkins  1983-84     Chattanooga  23   737  297   3   10  0.300   
 243    Delaney Rudd  1982-83     Wake Forest  32  1004  324  13   29  0.448  

関数をDataframeに適用することについて十分に理解していると思ったため、正規表現のスキルが不足している可能性があります。

ここに私がまとめたものがあります:

import re

def split_it(year):
    return re.findall('(\d\d\d\d)', year)

 df['Season2'] = df['Season'].apply(split_it(x))

TypeError: expected string or buffer

出力は、ハイフンの前の年を含むSeason2という列になります。私は正規表現なしでそれを行う簡単な方法があると確信していますが、より重要なことは、私が間違ったことを理解しようとしていることです

事前にご協力いただきありがとうございます。

16
itjcms18

あなたのコード(のバリアント)を試すと、NameError: name 'x' is not defined--そうではありません。

どちらかを使用できます

df['Season2'] = df['Season'].apply(split_it)

または

df['Season2'] = df['Season'].apply(lambda x: split_it(x))

しかし、2番目のものは最初のものを書くためのより長くて遅い方法ですので、あまり意味はありません(ここで扱っていない他の引数がない限り)。関数はlist、ただし:

>>> df["Season"].apply(split_it)
74     [1982]
84     [1982]
176    [1982]
177    [1983]
243    [1982]
Name: Season, dtype: object

簡単に変更できますが。 FWIW、ベクトル化された文字列操作を使用して、次のようなことをします

>>> df["Season"].str[:4].astype(int)
74     1982
84     1982
176    1982
177    1983
243    1982
Name: Season, dtype: int64

または

>>> df["Season"].str.split("-").str[0].astype(int)
74     1982
84     1982
176    1982
177    1983
243    1982
Name: Season, dtype: int64
19
DSM

尋ねられた問題は、次のコードを書くことで解決できます:

import re
def split_it(year):
    x = re.findall('([\d]{4})', year)
    if x :
      return(x.group())

df['Season2'] = df['Season'].apply(split_it)

いくつかの行には文字列の年がなかったため、この問題に直面していました

1
Pratik409

私はまったく同じ問題を抱えていました。 @DSMの回答に感謝します。 FYI @itjcms、'\d\d\d\d'の繰り返しを削除することで機能を改善できます。

def split_it(year):  
    return re.findall('(\d\d\d\d)', year)

になる:

def split_it(year):
    return re.findall('(\d{4})', year)
0
Tony Alleven