1
votes

Comment supprimer des chaînes de la colonne A des chaînes de la colonne B

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)


0 commentaires

3 Réponses :


1
votes

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.


0 commentaires

1
votes

Utilisation du découpage de chaînes:

df['Age'] = df.apply(lambda row: row['Name_Age'][len(row['Name']):], axis=1).astype(int)


1 commentaires

C'est une bonne solution avec lambda +1



0
votes

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.

1) En utilisant 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

2) Une autre option utilisant 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

3) une autre utilisant 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


0 commentaires