.assign
qui permet de créer/écraser des colonnes sur base d'autres colonnes à la volée, ou encore .pipe
qui permet d'appliquer un traitement à la volée sur un dataframe. Les deux prennent un callable en paramètre :df.assign(new_column=lambda df: df['old_column'] * 2)
par exemple, ou encore df.pipe(lambda df: 2 * df
(le premier crée une nouvelle colonne qui est le double d'une autre, le second crée un df où tout est doublé).df[lambda df: df['col'] >= 0]
. Si on veut plus de lisibilité, il y a aussi .query
qui permet d'écrire la requête sous forme de texte, par exemple df.query('col >= 0')
. Dépendant de l'usage, l'un est plus approprié/lisible que l'autre. new_df = (
old_df
[lambda df: df['column'] >= 0]
.assign(new_column=....)
.pipe(lambda df:
df.merge(other_df, .....)
)
.assign(somme=lambda df: df.sum(axis=1))
....
)
Ainsi, toutes tes transformations/manipulations sont faites "d'une seule traite", et tu stockes juste le résultat fini dans une variable (et les opérations intermédiaires disparaissent de la mémoire et ne pourrissent pas le namespace). Avec cette approche (et l'indentation/retour à la ligne), tu peux même facilement intégrer des commentaires pour expliquer chaque "étape" intermédiaire :new_df = (
old_df
# Keep positive values
[lambda df: df['column'] >= 0]
# Create a new column that is the result of...
.assign(new_column=....)
# Merge dataframe with ...
.pipe(lambda df:
(2 * df).merge(other_df, .....)
)
# Sum everything line by line
.assign(sum=lambda df: df.sum(axis=1))
....
)
Les commentaires peuvent paraître redondants avec le code dans cet exemple, mais la multiplication des fonctions lambda rend parfois la lecture du code difficile, alors un commentaire n'est jamais de trop dans ces cas-là
df.assign(new_column=lambda df: df['old_column'] * 2)
yaugSurtout quand tu n'as pas l'habitude des notations pythons du genre : df.assign(new_column=lambda df: df['old_column'] * 2)
Bon, ça ne va pas fondamentalement t'aider, mais ça donne des pointeurs KeyError: '20_Contract size for derivatives'
print(row)
:20_Contract size for derivatives NaN
row.get('20_Contract size for derivatives')
20_Contract size for derivatives 1
et que je cherche à afficher le contenu de la colonne, j'ai quand même un "None" et l'accès en mode tableau me renvoie tout de même une KeyError
Ce message a été modifié 1 fois.
Dernière modification : 12 septembre 2018
à 16:43 par
yaug.
1996-2024 — Lexpage v4 — GPLv3 (sources)
page générée le 22 décembre 2024 à 10:03:03