condition ? a : b
, on a ça a if condition else b
, c'est encore mieux avec les array, au lieu d'un array.filter(a => condition)
on a un chose comme [a for a in array if condition]
. Je trouve que ça casse le sens de lecture habituel de gauche vers la droite. Pareil quand d'une array on veut une propriété users.map(u => u.login)
, on va se retrouver avec [u.login for u in users]
et si on rajoute un filtre users.filter(u => u.active).map(u => u.login)
, est-ce que ça marche: [u.login for u in users if u.active]
?.find(x => condition)
import pandas as pd
... Ca commence bien. La fonction de filtre avec loc[...]
m'énerve, si la frame est vide, ça me fait une key error, ça pourrait simplement dire: vide. Si pour une clef, la valeur est None, ça ne filtre plus sur cette clef, franchement...PetitCalgonJ'en fait depuis peu (janvier) mais je ne suis toujours pas conquis. C'est pratique pour réaliser un script ou deux, mais faire une application avec... pourquoi?Question d'habitude
PetitCalgon- Typing décoratif et pas vérifié (on peut déclarer une variable d'un type dans une fonction et lui envoyer autre chose sans que ça râle)Il n'est pas purement décoratif, tu peux utiliser des outils tels que mypy pour faire cette vérification. La plupart des IDE incluent aussi un type checker si tu fais usage du typing en Python. Perso, j'aime vraiment bien le coté "typage dynamique" avec la possibilité de pouvoir annoter certaines parties du code.
PetitCalgon- Style d'écriture pas intuitif, exemple au lieu de l'opérateur ternaireJe préfère le ternaire de Python, plus lisible à mon goût quecondition ? a : b
, on a çaa if condition else b
, c'est encore mieux avec les array, au lieu d'unarray.filter(a => condition)
on a un chose comme[a for a in array if condition]
. Je trouve que ça casse le sens de lecture habituel de gauche vers la droite. Pareil quand d'une array on veut une propriétéusers.map(u => u.login)
, on va se retrouver avec[u.login for u in users]
et si on rajoute un filtreusers.filter(u => u.active).map(u => u.login)
, est-ce que ça marche:[u.login for u in users if u.active]
?
condition ? a: b
. Pour les "array", je ne comprends pas bien pourquoi tu passes par des compréhensions de liste pour faire ça. Tu peux très bien utiliser la fonction filter(condition, iterable)
ou map(function, iterable)
, et utiliser des lambda à la place de condition
ou function
si c'est du one-shot. Pour la question posée en fin de quote, oui, on peut combiner ce qu'on veut dans une compréhension : [f(x) for x in mylist if condition(x)
. PetitCalgon- Il manque plein de fonctions classique pour les array, un .find(x => condition)
Une boucle fait l'affaire Il y a des "astuces" à base de next
mais je trouve que ça rend le code moins lisible. Le module itertools
contient aussi quelques éléments supplémentaires pratiques à avoir sous la main si on travaille beaucoup avec les itérateurs. (docs.python.org/3/librar…) PetitCalgon- Les Panda Frame ça me gonfle! Déjà forcément faire unSi tu veux juste récupérer une seule ligne,import pandas as pd
... Ca commence bien. La fonction de filtre avecloc[...]
m'énerve, si la frame est vide, ça me fait une key error, ça pourrait simplement dire: vide. Si pour une clef, la valeur est None, ça ne filtre plus sur cette clef, franchement...
loc
est ton ami, mais il s'attend à recevoir la valeur de quelque chose dans ton index donc pas None. Si c'est pour faire une slice de ton dataframe, tu as df[condition]
ou df.query(...)
ou... Pandas est une chouette librairie, mais pas facile de s'y retrouver au début, et j'invite toujours mes étudiants à lire l'ensemble de la documentation au moins une fois, juste pour se faire une idée de tout ce qu'il y a. Souvent, on utilise pas la bonne solution juste parce qu'on était pas au courant qu'il existait cette possibilité. C'est rarement un problème lié à la librairie, mais plutôt de conception du problème (on se pose la mauvaise question, donc on adopte la mauvaise approche). Ici j'ai l'impression que c'est pas vraiment loc
que tu cherches à utiliser PetitCalgon- Comment je débugge ça dans VScode?Juste en installant l'extension Python pour vscode (je me demande si elle est pas déjà intégrée par défaut) et en utilisant le débuggueur intégré. Evidemment, si tu utilises pandas, il est probable que tu utilises des notebooks dans vscode. Dans ce cas, la manoeuvre est peut-être légèrement différente, j'utilise pas vscode pour mes notebooks (j'utilise jupyter lab) donc je peux pas aider, mais je suis sûr d'avoir déjà vu du support pour débugguer des "cells" de notebooks dans vscode.
PetitCalgonMerci, je pense que comme dans la plupart des cas, il me manquait l'existence de certaines fonctions.Avec pandas, c'est malheureusement souvent le cas. La librairie est titanesque en matière de fonctionnalités, et c'est difficile de chercher précisément quelque chose dans la documentation. Le "User guide" est pas mal pour ça, car il couvre une grosse partie de ce qu'on peut faire avec pandas, et juste "savoir que ça existe même si on a pas retenu le nom de la fonction" est déjà un très gros premier pas dans la bonne direction
PetitCalgonPar contre, ce qui est rigolo et pratique, c'est les paramètres nommés qu'on peut mettre dans l'ordre que l'on veut.On peut même stocker les paramètres dans un dictionnaire, et puis les réutiliser lors des appels :
>>> d = {'x': 1, 'y': 2, 'z': 3}
>>> f(**d)
... correspond à appeler f(x=1, y=2, z=3)
.
.iloc[]
ne supporte pas quand on met une lambda avec un and
dedans.results = frame.iloc[lambda u:u["id"] == "xyz" and u["name"] == "abc"]
Si on faitresults = frame.iloc[lambda u:u["id"] == "xyz"]
results = results.iloc[lambda u:u["name"] == "abc"]
bizarrement ça marche (avec un test au milieu que len(results)>0
)
Ce message a été modifié 1 fois.
Dernière modification : 18 juillet 2023
à 17:37 par
PetitCalgon.
and, or, not
ne fonctionnent que dans un contexte Booléen. Je ne sais pas pourquoi Python ne permet pas de les surcharger, mais du coup, la seule alternative pour une librairie qui souhaite fournir des opérations Booléennes sur d'autres structures consiste à surcharger les opérateurs bitwise &, |, ~
. Ce sont ceux-là qu'il faut utiliser. u["id"] == "xyz"
et u["name"] == "abc"
retournent chacun un tableau de Booléens, et Python ne sait pas quoi faire avec and
pour ces tableaux. Si tu remplaces and
par &
(et que tu mets des parenthèses autour de chaque expression, car la priorité des opérateurs est différente) ça ira.
1996-2024 — Lexpage v4 — GPLv3 (sources)
page générée le 22 décembre 2024 à 09:39:31