La question initiale porte sur un cas d'utilisation spécifique et restreint. Pour ceux qui ont besoin de réponses plus générales, voici quelques exemples :
Création d'une nouvelle colonne à partir de données provenant d'autres colonnes
Etant donné le cadre de données ci-dessous :
import pandas as pd
import numpy as np
df = pd.DataFrame([['dog', 'hound', 5],
['cat', 'ragdoll', 1]],
columns=['animal', 'type', 'age'])
In[1]:
Out[1]:
animal type age
----------------------
0 dog hound 5
1 cat ragdoll 1
Ci-dessous, nous ajoutons un nouveau description
comme une concaténation d'autres colonnes en utilisant l'option +
qui est remplacée par une opération en série. Le formatage fantaisiste des chaînes de caractères, les chaînes f, etc. ne fonctionneront pas ici, puisque la fonction +
s'applique aux scalaires et non aux valeurs "primitives" :
df['description'] = 'A ' + df.age.astype(str) + ' years old ' \
+ df.type + ' ' + df.animal
In [2]: df
Out[2]:
animal type age description
-------------------------------------------------
0 dog hound 5 A 5 years old hound dog
1 cat ragdoll 1 A 1 years old ragdoll cat
Nous obtenons 1 years
pour le chat (au lieu de 1 year
) que nous allons corriger ci-dessous à l'aide de conditionnels.
Modifier une colonne existante avec des conditionnelles
Ici, nous remplaçons l'original animal
avec des valeurs provenant d'autres colonnes, et en utilisant np.where
pour définir une sous-chaîne conditionnelle basée sur la valeur de age
:
# append 's' to 'age' if it's greater than 1
df.animal = df.animal + ", " + df.type + ", " + \
df.age.astype(str) + " year" + np.where(df.age > 1, 's', '')
In [3]: df
Out[3]:
animal type age
-------------------------------------
0 dog, hound, 5 years hound 5
1 cat, ragdoll, 1 year ragdoll 1
Modifier plusieurs colonnes avec des conditionnelles
Une approche plus souple consiste à appeler .apply()
sur l'ensemble d'un cadre de données plutôt que sur une seule colonne :
def transform_row(r):
r.animal = 'wild ' + r.type
r.type = r.animal + ' creature'
r.age = "{} year{}".format(r.age, r.age > 1 and 's' or '')
return r
df.apply(transform_row, axis=1)
In[4]:
Out[4]:
animal type age
----------------------------------------
0 wild hound dog creature 5 years
1 wild ragdoll cat creature 1 year
Dans le code ci-dessus, l'élément transform_row(r)
prend un Series
représentant une ligne donnée (indiquée par axis=1
la valeur par défaut de axis=0
fournira une Series
pour chaque colonne). Cela simplifie le traitement puisque vous pouvez accéder aux valeurs "primitives" réelles de la ligne en utilisant les noms des colonnes et que vous avez la visibilité des autres cellules dans la ligne/colonne donnée.