Je me demande comment utiliser l'expression régulière pour supprimer les caractères non numériques tout en ne sélectionnant que les valeurs non vides et les espaces (une seule valeur peut contenir un ou plusieurs espaces) pour une série de manière plus efficace,

df['numeric_no'] = df['id'].apply(lambda x: re.sub("[^0-9]", "", x))
df = df[(df['numeric_no'] != '') & (df['numeric_no'] != ' ')]

Quelques exemples de données pour le df

numeric_no
B-27000
44-11-E
LAND-11-4
17772A
88LL9A
321LP-3
UNIT 9 CAM -00-12
WWcard_055_34QE
EE119.45
aaa
b  b

Le résultat ressemblera à

numeric_no
27000
4411
114
17772
889
3213
90012
05534
119.45
0
daiyue 23 mai 2018 à 14:12

3 réponses

Meilleure réponse

Je pense que j'ai besoin de str.findall avec boolean indexing:

s = df['numeric_no'].str.findall("(\d*\.\d+|\d+)").str.join('')

s = s[s.astype(bool)]
print (s)

0     27000
1      4411
2       114
3     17772
4       889
5      3213
6     90012
7     05534
8    119.45
Name: numeric_no, dtype: object
1
jezrael 23 mai 2018 à 12:12

Vous pouvez faire correspondre et capturer des nombres et faire correspondre n'importe quoi d'autre:

(\d+(?:\.\d+)?)|.

Démo en direct

Remplacez ensuite match par $1 (une référence arrière au premier groupe de capture)

Code Python:

re.sub(r"(\d+(?:\.\d+)?)|.", "$1", x) 
1
revo 23 mai 2018 à 11:58

Je pense que je peux essayer:

df.numeric_no.str.extractall('(\d+?[\.\d+])').astype(str).sum(level=0)

Production:

        0
0    2700
1    4411
2      11
3    1777
4      88
5      32
6    0012
7    0534
8  119.45
1
Scott Boston 23 mai 2018 à 12:02