3 votes

Remplacer les valeurs des colonnes d'un dataframe à partir d'une boucle re.search

Comment puis-je remplacer les valeurs d'une colonne de dataframe existante par les valeurs de la boucle re.search ?

C'est ma boucle de recherche.

for i in dataset['col1']:
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    print(clean.group())    

Voici l'échantillon de données (dataset)

    year    col1
1    2001    10.563\D
2    2002    9.540\A
3    2003    4.674\G
4    2004    3.2754\u
5    2005    nan\x

3voto

Shubham Sharma Points 39381

Vous pouvez utiliser Series.apply pour appliquer la fonction personnalisée à la dataset["col1"] . Ou, mieux encore, vous pouvez utiliser Series.str.replace pour remplacer le motif par la chaîne de remplacement.

Essayez ça :

def func(i):
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    return clean.group()

dataset["col1"] = dataset["col1"].apply(func)

Ou mieux,

df["col1"] = df["col1"].str.replace(r'(.*?)(\\.*?$)', r"\1")

Sortie :

>>> print(dataset)

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan

2voto

Ryohei Namiki Points 371

En utilisant votre méthode :

dataset["col1"] = dataset["col1"].apply(lambda x: re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', x).group())

bien que personnellement, je ferais ceci à la place :

dataset["col1"] = dataset["col1"].str[:-2]

2voto

sammywemmy Points 14854

Vous pouvez utiliser les pandas extrait de str avec une assertion d'anticipation - il ne gardera que les éléments avant le '\'.

  df['cleaned'] = df["col1"].str.extract(r'(.*(?=\\))')

     year   col1        cleaned
1   2001    10.563\D    10.563
2   2002    9.540\A     9.540
3   2003    4.674\G     4.674
4   2004    3.2754\u    3.2754
5   2005    nan\x       nan

2voto

JvdV Points 16691

J'utiliserais split plutôt que des modèles d'expressions régulières plus longs dans ce cas :

dataset['col1'] = dataset['col1'].str.split('\\').str[0]

ou, pour split en float type de données :

dataset['col1'] = dataset['col1'].str.split('\\').str[0].astype(float)

Cela permettrait de transformer ces valeurs en place, et n'est pas sujet à erreur. Elle prend simplement toujours le premier élément du tableau résultant dans le cas où un backslash existe.

Résultat :

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X