1
votes

Utilisez une expression régulière pour extraire des éléments d'une trame de données pandas

À partir du bloc de données suivant:

AttributeError: 'StringMethods' object has no attribute 'search'

Mon but ultime est d'extraire les lettres a, b ou c (sous forme de chaîne) dans une série pandas. Pour cela, j'utilise la méthode .findall () du module re , comme indiqué ci-dessous:

df['col1'].str.search(pat).group()

Le Le problème est que la sortie, c'est-à-dire les lettres a, b ou c, dans chaque ligne, sera présente dans une liste (d'un seul élément), comme indiqué ci-dessous:

0    a
1    b
2    c
3    a

Bien que j'aimerais avoir les lettres a, b ou c comme chaîne, comme indiqué ci-dessous:

Out[301]: 
0    [a]
1    [b]
2    [c]
3    [a]

Je sais que si je combine re.search () avec .group () Je peux obtenir une chaîne, mais si je le fais:

# import the module
import re
# define the patterns
pat = 'a|b|c'

# extract the patterns from the elements in the specified column
df['col1'].str.findall(pat)

Je le ferai obtenez le message d'erreur suivant:

d = {'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']}

df = pd.DataFrame.from_dict(d)

L'utilisation de .str.split () ne fera pas l'affaire car, dans mon dataframe d'origine, je veux pour capturer les chaînes qui pourraient contenir le délimiteur (par exemple, je pourrais vouloir capturer ab)

Est-ce que quelqu'un connaît une solution simple pour cela, peut-être en évitant les opérations itératives telles qu'une boucle for ou compréhension de la liste?


1 commentaires

3 Réponses :


1
votes

Utilisez extraire avec les groupes de capture:

   0
0  a
1  b
2  c
3  a

Sortie

import pandas as pd

d = {'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']}

df = pd.DataFrame.from_dict(d)

result = df['col1'].str.extract('(a|b|c)')

print(result)


0 commentaires

0
votes

Corrigez votre code

pat = 'a|b|c'
df['col1'].str.findall(pat).str[0]
Out[309]: 
0    a
1    b
2    c
3    a
Name: col1, dtype: object


0 commentaires

0
votes

Essayez simplement avec str.split ( ) comme ceci - df ["col1"]. str.split ("-", n = 1, expand = True)

  col1
0    a
1    b
2    c
3    a

Sortie:

import pandas as pd
d = {'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']}
df = pd.DataFrame.from_dict(d)
df['col1'] = df["col1"].str.split("-", n = 1, expand = True) 
print(df.head())


4 commentaires

En fait, cela fait le travail pour cet exemple d'exemple, cependant, dans mon df d'origine, le fractionnement des observations ne fera pas le travail parce que ce que je veux capturer peut contenir le symbole - . c'est-à-dire que je veux aussi capturer quelque chose comme a-b


@BCArg puis éditez votre question et faites-nous savoir quelle est la valeur possible de votre col1?


@BCArg comment df ['col1']. Str.findall (pat) .str [0] capture a-b ?


il le sera au cas où je précise que je veux le capturer. Dans mon bloc de données d'origine, j'ai une poignée de paramètres que je veux capturer, donc je n'ai pas besoin d'être sophistiqué avec les expressions régulières.