Je me demande si vous avez deux colonnes (A = 'Name', B = 'Name_Age'), y a-t-il un moyen rapide de supprimer 'Name' de 'Name_Age' afin que vous puissiez rapidement obtenir 'Age', comme un enchaînement??
J'ai pensé à 'string split', mais dans certains cas (quand il n'y a pas de facteur de fractionnement de chaîne) j'ai vraiment besoin d'une méthode pour supprimer les chaînes d'une colonne des chaînes d'une autre.
#example data below: import pandas as pd data = {'Name':['Mark','Matt','Michael'], 'Name_Age':['Mark 14','Matt 29','Michael 18']} df = pd.DataFrame(data)
3 Réponses :
Vous pouvez essayer d'utiliser la fonction pandas apply
, qui vous permet de définir votre propre fonction à transmettre à chaque ligne du dataframe:
def age_from_name_age(name, name_age): return name_age.replace(name, '').strip() df['Age'] = df.apply(lambda x: age_from_name_age(x['Name'], x['Name_Age']), axis='columns')
age_from_name_age
prend deux chaînes (un nom et un name_age), et ne renvoie que l'âge. Ensuite, dans l'instruction apply, je définis une fonction lambda anonyme qui prend juste une ligne et passe les champs corrects à age_from_name_age
.
Utilisation du découpage de chaînes:
df['Age'] = df.apply(lambda row: row['Name_Age'][len(row['Name']):], axis=1).astype(int)
C'est une bonne solution avec lambda +1
Vous pouvez utiliser str.split ()
pour séparer les valeurs des noms de colonnes avec un séparateur d'espace, puis renommer les colonnes avec de nouveaux noms.
str.split ()
>>> df.assign(Age = df.Name_Age.apply(lambda x: x.split()[1])) Name Name_Age Age 0 Mark Mark 14 14 1 Matt Matt 29 29 2 Michael Michael 18 18 OR >>> df.Name_Age.apply(lambda x: pd.Series(str(x).split())).rename({0:"Name",1:"Age"}, axis=1) Name Age 0 Mark 14 1 Matt 29 2 Michael 18
OU
>>> df['Name_Age'].str.partition(" ", True).rename(columns={0:'Name', 2:'Age'}).drop(1, axis=1) Name Age 0 Mark 14 1 Matt 29 2 Michael 18
OU, en convertissant la liste fractionnée en nouveau dataframe: p>
>>> pd.DataFrame(df.Name_Age.str.split().tolist(), columns="Name Age".split()) Name Age 0 Mark 14 1 Matt 29 2 Michael 18
str.partition
>>> df = df['Name_Age'].str.split(" ", expand=True).rename(columns={0:'Name', 1:'Age'}) >>> df Name Age 0 Mark 14 1 Matt 29 2 Michael 18
df.assign
avec lambda
Utilisez split ()
avec le séparateur par défaut comme suit et en attribuant les valeurs avec la nouvelle colonne Âge
.
>>> df['Name_Age'].str.split(" ", expand=True).rename(columns={0:'Name', 1:'Age'}) Name Age 0 Mark 14 1 Matt 29 2 Michael 18