Je voudrais ajouter une chaîne au début de chaque valeur dans une dite colonne d'un dataframe pandas (élégamment). J'ai déjà compris comment faire cela et j'utilise actuellement:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Cela semble une sacrée chose inélégante à faire - connaissez-vous une autre façon (qui ajoute peut-être également le caractère aux lignes où cette colonne est 0 ou NaN)?
Au cas où cela ne serait pas encore clair, je voudrais tourner:
col
1 a
2 0
dans:
col
1 stra
2 str0
!= False
entreprise? Voulez-vous ajouterstr
à chaque valeur ou seulement une partie?df['col'] = 'str' + df['col'].astype(str)
?Réponses:
Exemple:
la source
Comme alternative, vous pouvez également utiliser un
apply
combiné avecformat
(ou mieux avec des f-strings) que je trouve légèrement plus lisible si, par exemple, on veut également ajouter un suffixe ou manipuler l'élément lui-même:qui donne également la sortie souhaitée:
Si vous utilisez Python 3.6+, vous pouvez également utiliser des chaînes f:
produisant le même résultat.
La version f-string est presque aussi rapide que la solution de @ RomanPekar (python 3.6.4):
L'utilisation
format
, cependant, est en effet beaucoup plus lente:la source
format
fonctionne en effet pire. Comment avez-vous comparé?.apply
est toujours soit aussi rapide ou plus lent que les opérations vectorisées «directes»; même s'ils ne sont pas plus lents, je préfère les éviter dans la mesure du possible.x
lui-même etc., mais c'est juste une question de goût ... :)Vous pouvez utiliser pandas.Series.map:
Il appliquera le mot «str» avant toutes vos valeurs.
la source
Si vous chargez votre fichier de table avec
dtype=str
ou convertissez le type de colonne en chaîne,
df['a'] = df['a'].astype(str)
vous pouvez utiliser une telle approche:
Cette approche permet d'ajouter une chaîne de préfixe, d'ajout et de sous-ensemble de
df
.Fonctionne sur Pandas v0.23.4, v0.24.1. Je ne connais pas les versions antérieures.
la source
Une autre solution avec .loc:
Ce n'est pas aussi rapide que les solutions ci-dessus (> 1 ms par boucle plus lent) mais peut être utile au cas où vous auriez besoin d'un changement conditionnel, comme:
la source
.index
dansdf[mask].index
?df.loc[mask]
ça marche, et ça marche, alors.index
c'est superflu, non?