J'ai python pandas dataframe, servi par le support de transformation de source de données power bi pour l'exécution du script python, où l'une des colonnes se compose de lastname, firstname et j'ai besoin qu'elle soit composée de firstname lastname .
J'ai essayé l'approche de jointure inversée suivante qui fonctionne sur un argument de chaîne autonome mais génère AttributeError: l'objet 'Series' n'a pas d'attribut 'split' code > quand je l'essaie sur des données de colonne dans un dataframe pandas.
name = 'LastName, FirstName'
' '.join(reversed(name.split(', ')))
# output = 'FirstName LastName'
import pandas as pd
df = pd.DataFrame({'full_name': ['doe, john', 'smith, kate', 'jones, susan', 'edwards, jack' ],
'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
df
df['full_name'] = ' '.join(reversed(df['full_name'].split(', ')))
# output = AttributeError: 'Series' object has no attribute 'split'
Recherche SO je vois des résultats pour faire quelque chose de cette nature dans un excel colonne et dans une Liste R mais je n'ai encore rien trouvé pour la colonne dans un dataframe pandas python.
3 Réponses :
Dans votre cas, nous pouvons faire split avec map PS: :: - 1 ici est inversé l'ordre
df.full_name=df.full_name.str.split(', ').map(lambda x : ' '.join(x[::-1]))
df.full_name
falcon john doe
dog kate smith
spider susan jones
fish jack edwards
Name: full_name, dtype: object
Je pensais que ma solution serait plus rapide ... mais la profiler sur 50k entrées cette solution a pris 2 secondes, la mienne était de 3,4 (pour fonctionner 10 fois avec timeit)
L'erreur est due au fait que le type de la variable type (df ['full_name']) est . Convertissez-le en liste puis utilisez:
import pandas as pd
df = pd.DataFrame({'full_name': ['doe, john', 'smith, kate', 'jones, susan', 'edwards, jack' ],
'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
print(map(lambda x: x.split(',')[::-1], df['full_name'].tolist()))
merci pour la réponse, quand je lance cela, j'obtiens pour la sortie et la sortie de l'exécution de df.full_name après cela apparaît inchangé
Une combinaison des méthodes de chaîne de pandas pourrait aider ici: pour la rapidité, je suggérerais d'exécuter une compréhension de liste dans python lui-même. Les méthodes de chaîne dans Pandas sont fournies principalement pour des raisons de commodité / simplicité.
df['full_name'] = df.full_name.str.split(",").str[::-1].str.join(",")
full_name num_legs num_wings num_specimen_seen
falcon john,doe 2 2 10
dog kate,smith 4 0 2
spider susan,jones 8 0 1
fish jack,edwards 0 0 8