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という列になります。私は正規表現なしでそれを行う簡単な方法があると確信していますが、より重要なことは、私が間違ったことを理解しようとしていることです
事前にご協力いただきありがとうございます。
あなたのコード(のバリアント)を試すと、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
尋ねられた問題は、次のコードを書くことで解決できます:
import re
def split_it(year):
x = re.findall('([\d]{4})', year)
if x :
return(x.group())
df['Season2'] = df['Season'].apply(split_it)
いくつかの行には文字列の年がなかったため、この問題に直面していました
私はまったく同じ問題を抱えていました。 @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)