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']
4 Réponses :
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)
@Javier de rien, vous pouvez accepter la réponse qui vous a aidé, bravo!
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
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?
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_])
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)
Si vous ne souhaitez pas égaler EUR en EUROPE, consultez ma réponse .