La question d'origine concerne un cas d'utilisation restreint spécifique. Pour ceux qui ont besoin de réponses plus génériques, voici quelques exemples:
Créer une nouvelle colonne en utilisant les données d'autres colonnes
Compte tenu de la base 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 une nouvelle description
colonne en tant que concaténation d'autres colonnes en utilisant l' +
opération qui est remplacée pour les séries. Le formatage de chaîne fantaisie, les chaînes f, etc. ne fonctionneront pas ici car le +
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 corrigerons ci-dessous en utilisant des conditions.
Modifier une colonne existante avec des conditions
Ici, nous remplaçons la animal
colonne d' origine par des valeurs d'autres colonnes et utilisons 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
Modification de plusieurs colonnes avec des conditions
Une approche plus flexible consiste à faire appel .apply()
à un dataframe entier plutôt qu'à 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, la transform_row(r)
fonction prend un Series
objet représentant une ligne donnée (indiqué par axis=1
, la valeur par défaut de axis=0
fournira un Series
objet pour chaque colonne). Cela simplifie le traitement car nous pouvons accéder aux valeurs «primitives» réelles de la ligne en utilisant les noms de colonne et avoir la visibilité des autres cellules dans la ligne / colonne donnée.
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'