196 votes

Suppression des parties non désirées des chaînes de caractères dans une colonne

Je cherche un moyen efficace de supprimer les parties non désirées des chaînes de caractères dans une colonne DataFrame.

Les données ressemblent :

    time    result
1    09:00   +52A
2    10:00   +62B
3    11:00   +44a
4    12:00   +30b
5    13:00   -110a

J'ai besoin de réduire ces données à :

    time    result
1    09:00   52
2    10:00   62
3    11:00   44
4    12:00   30
5    13:00   110

J'ai essayé .str.lstrip('+-') et . str.rstrip('aAbBcC') mais j'ai eu une erreur :

TypeError: wrapper() takes exactly 1 argument (2 given)

Tout conseil serait grandement apprécié !

11voto

Ted Petrou Points 20559

Une méthode très simple consisterait à utiliser le extract pour sélectionner tous les chiffres. Il suffit de lui fournir l'expression régulière '\d+' qui extrait un nombre quelconque de chiffres.

df['result'] = df.result.str.extract(r'(\d+)', expand=True).astype(int)
df

    time  result
1  09:00      52
2  10:00      62
3  11:00      44
4  12:00      30
5  13:00     110

7voto

Rishi Bansal Points 756

Supposons que votre DF ait aussi ces caractères supplémentaires entre les chiffres. La dernière entrée.

  result   time
0   +52A  09:00
1   +62B  10:00
2   +44a  11:00
3   +30b  12:00
4  -110a  13:00
5   3+b0  14:00

Vous pouvez essayer str.replace pour supprimer les caractères non seulement au début et à la fin, mais aussi entre les deux.

DF['result'] = DF['result'].str.replace('\+|a|b|\-|A|B', '')

Salida:

  result   time
0     52  09:00
1     62  10:00
2     44  11:00
3     30  12:00
4    110  13:00
5     30  14:00

6voto

tim654321 Points 1344

J'utilise souvent des listes de compréhension pour ce type de tâches, car elles sont souvent plus rapides.

Il peut y avoir de grandes différences de performance entre les diverses méthodes pour faire des choses comme cela (c'est-à-dire modifier chaque élément d'une série dans un DataFrame). Souvent, une compréhension de liste peut être la plus rapide - voir la course de code ci-dessous pour cette tâche :

import pandas as pd
#Map
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']})
%timeit data['result'] = data['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC'))
10000 loops, best of 3: 187 µs per loop
#List comprehension
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']})
%timeit data['result'] = [x.lstrip('+-').rstrip('aAbBcC') for x in data['result']]
10000 loops, best of 3: 117 µs per loop
#.str
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']})
%timeit data['result'] = data['result'].str.lstrip('+-').str.rstrip('aAbBcC')
1000 loops, best of 3: 336 µs per loop

0voto

Mr. Prophet Points 58

Essayez ceci en utilisant une expression régulière :

import re
data['result'] = data['result'].map(lambda x: re.sub('[-+A-Za-z]',x)

0voto

Ali karimi Points 63

L'utilisation de "str.replace" est plus rapide que lambda et map lorsque la taille de vos données est importante :

your_data["result"]=your_data["result"].str.replace("+","")
your_data["result"]=your_data["result"].str.replace("-","")

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