3
votes

Détecter une séquence spécifique de chaîne dans une colonne à partir d'une liste

J'essaye d'extraire des chaînes spécifiques en utilisant une liste. Serait-ce possible en Python?

J'ai cette liste ici:

     Name       Currency
0   Tom RANDOM_SGD_2017
1   nick    TEST_EUR_1381
2   krish   FORFUN GBP
3   jack    NAs

Et si l'une de ces chaînes apparaît dans une colonne, je voudrais qu'une nouvelle colonne soit créé avec la devise respective. Voici ma sortie prévue:

Sortie prévue

import pandas as pd 

data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs']} 

df = pd.DataFrame(data) 

Exemple reproductible

Name         Currency        Currency_updated    
0   Tom    RANDOM_SGD_2017         SGD
1   nick    TEST_EUR_1381          EUR
2   krish   FORFUN GBP             GBP
3   jack    NAs                    <blank>

Dataframe utilisé

currency = ['SGD', 'GBP', 'USD', 'EUR']


1 commentaires

Si vous ne souhaitez pas égaler EUR en EUROPE, consultez ma réponse .


4 Réponses :


2
votes

Vous pouvez créer une fonction qui opère sur les lignes de votre dataframe:

    Name         Currency Currency_Updated
0    Tom  RANDOM_SGD_2017              SGD
1   nick    TEST_EUR_1381              EUR
2  krish       FORFUN GBP              GBP
3   jack              NAs             None

OUTPUT :

import pandas as pd

def f(row):
  for elem in currency:
      if elem in row['Currency']:
           return elem

currency = ['SGD', 'GBP', 'USD', 'EUR']
data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs']}

df = pd.DataFrame(data)
df['Currency_Updated'] = df.apply(f, axis=1)
print(df)


1 commentaires

@Javier de rien, vous pouvez accepter la réponse qui vous a aidé, bravo!



3
votes

Utilisez la série .str.extract avec join et | pour l'expression régulière OU - 'SGD | GBP | USD | EUR ' signifie ' SGD 'ou' GBP 'ou' USD 'ou' EUR '

pat = '|'.join(currency)
df['Currency_updated'] = df['Currency'].str.extract('('+ pat + ')', expand=False)
print (df)
    Name         Currency Currency_updated
0    Tom  RANDOM_SGD_2017              SGD
1   nick    TEST_EUR_1381              EUR
2  krish       FORFUN GBP              GBP
3   jack              NAs              NaN


1 commentaires

hé merci pour la réponse, puis-je vous demander pourquoi vous avez utilisé '|' dans votre première ligne? Qu'est ce que ça fait?



1
votes

Je suggère d'utiliser str.extract avec

>>> df
    Name            Currency Currency_updated
0    Tom     RANDOM_SGD_2017              SGD
1   nick       TEST_EUR_1381              EUR
2  krish          FORFUN GBP              GBP
3   jack                 NAs              NaN
4    meg  More fun in EUROPE              NaN
5  sarah     And MUSDA thing              NaN

Voir le démo regex .

Notez que le (? / (?! [^ \ W_]) sont des limites de mots sans ambiguïté qui considèrent également _ (traits de soulignement) comme des caractères "non-mots", donc EUR dans _EUR _ code> est considéré comme un mot entier.

En Python, l'expression régulière peut être construite en utilisant r '(? , avec re.escape , juste au cas où vous auriez $ ou d'autres caractères spéciaux dans les noms des devises, comme CA$.

import re
import pandas as pd

data = {'Name':['Tom', 'nick', 'krish', 'jack', 'meg', 'sarah'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs', 'More fun in EUROPE', 'And MUSDA thing']}
currency = ['SGD', 'GBP', 'USD', 'EUR']
df = pd.DataFrame(data)

rx = r'(?<![^\W_])({})(?![^\W_])'.format('|'.join(map(re.escape, currency)))
df['Currency_updated'] = df['Currency'].str.extract(rx, expand=False)

Sortie:

(?<![^\W_])(SGD|GBP|USD|EUR)(?![^\W_])


0 commentaires

3
votes

Une autre méthode pourrait être d'utiliser re.search ()

import re
df['Currency_updated'] = df['Currency'].apply(lambda x: re.search('|'.join(currency), x).group(0) if x!='NAs' else None)


0 commentaires