Je ne parviens pas à appliquer une fonction d'expression rationnelle à une colonne dans un cadre de données python. Voici la tête de mon dataframe:
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
Je pensais maîtriser l’application de fonctions aux images, de sorte que mes compétences en regex font peut-être défaut.
Voici ce que je mets ensemble:
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
La sortie sera une colonne appelée Season2 qui contient l'année avant le trait d'union. Je suis sûr qu'il y a un moyen plus facile de le faire sans regex, mais plus important encore, j'essaie de comprendre ce que j'ai fait de mal
Merci d'avance pour toute aide.
Lorsque j'essaie (une variante de) votre code, je reçois NameError: name 'x' is not defined
--, ce qu'il n'est pas.
Vous pouvez utiliser soit
df['Season2'] = df['Season'].apply(split_it)
ou
df['Season2'] = df['Season'].apply(lambda x: split_it(x))
mais le second est juste un moyen plus long et plus lent d’écrire le premier, donc il n’ya pas grand intérêt (sauf si vous avez d’autres arguments à gérer, ce que nous n’avons pas ici). Votre fonction retournera une liste , bien que:
>>> df["Season"].apply(split_it)
74 [1982]
84 [1982]
176 [1982]
177 [1983]
243 [1982]
Name: Season, dtype: object
bien que vous puissiez facilement changer cela. FWIW, je voudrais utiliser des opérations de chaîne vectorisées et faire quelque chose comme
>>> df["Season"].str[:4].astype(int)
74 1982
84 1982
176 1982
177 1983
243 1982
Name: Season, dtype: int64
ou
>>> df["Season"].str.split("-").str[0].astype(int)
74 1982
84 1982
176 1982
177 1983
243 1982
Name: Season, dtype: int64
Le problème posé peut être résolu en écrivant le code suivant:
import re
def split_it(year):
x = re.findall('([\d]{4})', year)
if x :
return(x.group())
df['Season2'] = df['Season'].apply(split_it)
Vous faisiez face à ce problème car certaines lignes n'avaient pas d'année dans la chaîne