J'ai une base de données avec une colonne qui contient des informations sur le nombre d'années / de mois pendant lesquels la personne a un compte auprès de l'organisation.
Le champ est un format de texte personnalisé,
par exemple: «0yrs 11mon», «15yrs 4mon» etc.
Existe-t-il un moyen d'extraire simplement pour extraire les années et les mois dans une colonne séparée comme ci-dessous:
Member Since | Year | Mon ------------------------- '0yrs 11mon' | 0 | 11 ------------------------------------------- '15yrs 4mon' | 15 | 4 ---------------------
5 Réponses :
Vous pouvez utiliser Series.str.extract :
df[['year','mon']]= df['Member Since'].str.extractall('(\d+)').unstack() df Member Since year mon 0 0yrs 11mon 0 11 1 15yrs 4mon 15 4
le ?:
est une notation de groupe non capturante. Ce qui signifie qu'il correspond à l'expression régulière mais ne capture pas dans la sortie
Vous pouvez également essayer Series.str.extractall :
df['Year'] = df['Member Since'].str.extract('(\d+)(?:yrs)') df['Mon'] = df['Member Since'].str.extract('(?:\s)(\d+)(?:mon)')
La fonction extractall renvoie en fait un DataFrame avec une ligne pour chaque correspondance et une colonne pour chaque groupe et vous devez donc le désempiler.
Utilisez la méthode extraire tout uniquement si vous avez des nombres comme indiqué dans votre question. Plus ou moins de deux renverront une erreur.
Merci Mohit .. L'extractall fonctionne, mais l'extrait ne fonctionne pas .. j'obtiens l'erreur "le modèle ne contient aucun groupe de capture"
Dans ce cas, utilisez (\d+)(?:yrs)
et (?:\s)(\d+)(?:mon)
. J'ai apporté les modifications à la réponse.
Si vous avez les données dans Excel, cela pourrait fonctionner: -
import pandas as pd data=pd.read_excel('filename') month=data['Mon'] year=data['Year']
Member Since year month 0 0yrs 11mon 0 11 1 15yrs 4mon 15 4
Une alternative à Regex utilisant la solution str.extract
serait,
df["Year"] = df["Member Since"].str.extract("(\d+)yrs") df["Mon"] = df["Member Since"].str.extract("(\d+)mon")
Utilisation de str.findall
pd.DataFrame(df['Member Since'].str.findall('\d+').tolist(),columns=['Year','Mon']) Year Mon 0 0 11 1 15 4