web-dev-qa-db-fra.com

application de regex à une base de données pandas

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.

12
itjcms18

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
13
DSM

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

1
Pratik409