J'essaie de reprogrammer mon code Stata en Python pour des améliorations de vitesse, et j'ai été dirigé vers PANDAS. Cependant, j'ai du mal à comprendre comment traiter les données.
Disons que je souhaite parcourir toutes les valeurs de l'en-tête de colonne «ID». Si cet identifiant correspond à un nombre spécifique, je souhaite modifier deux valeurs correspondantes FirstName et LastName.
Dans Stata, cela ressemble à ceci:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Cela remplace donc toutes les valeurs de FirstName qui correspondent aux valeurs de ID == 103 à Matt.
Dans PANDAS, j'essaye quelque chose comme ça
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
Je ne sais pas où aller d'ici. Des idées?
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
Vous pouvez utiliser
map
, il peut mapper les valeurs d'une dictonairy ou même d'une fonction personnalisée.Supposons que ce soit votre df:
Créez les dictats:
Et carte:
Le résultat sera:
Ou utilisez une fonction personnalisée:
la source
dict
était créé pour le mappage. Sinon, une vérification / nettoyage peut être effectué sur la base de quelque chose comme:df.ID.isin(names.keys())
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:
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':Nous obtenons
1 years
pour le chat (au lieu de1 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 utilisonsnp.where
pour définir une sous-chaîne conditionnelle basée sur la valeur deage
:Modification de plusieurs colonnes avec des conditions
Une approche plus flexible consiste à faire appel
.apply()
à un dataframe entier plutôt qu'à une seule colonne:Dans le code ci-dessus, la
transform_row(r)
fonction prend unSeries
objet représentant une ligne donnée (indiqué paraxis=1
, la valeur par défaut deaxis=0
fournira unSeries
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.la source
np.where
est probablement ce que vous recherchez, voir par exemple stackoverflow.com/a/42540310/191246 mais il est également possible que vous ne puissiez pas adapter la logique dans une opération scalaire, alors vous devrez explicitement transformer la cellule numériquement similaire à la façon dont c'est fait danstransform_row
Cette question pourrait encore être visitée assez souvent pour qu'il vaille la peine d'offrir un addendum à la réponse de M. Kassies. La
dict
classe intégrée peut être sous-classée afin qu'une valeur par défaut soit renvoyée pour les clés «manquantes». Ce mécanisme fonctionne bien pour les pandas.Mais voyez ci-dessous.De cette manière, il est possible d'éviter les erreurs clés.
La même chose peut être faite plus simplement de la manière suivante. L'utilisation de l'argument 'default' pour la
get
méthode d'un objet dict rend inutile la sous-classe d'un dict.la source