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