Après beaucoup d'erreurs, d'exceptions et d'hypertension, j'ai finalement trouvé cette solution qui fonctionne pour ce dont j'avais besoin: en gros, je dois calculer toutes les valeurs de colonne qui respectent une condition spécifique.

Alors, disons que j'ai une liste de chaînes comme

vehicle = ['car', 'boat', 'car', 'car', 'bike', 'tank', 'DeLorean', 'tank']

Je veux compter les valeurs qui apparaissent plus de 2 fois.

Considérez que le nom de colonne du dataframe basé sur la liste est «veh».

Donc, ce morceau de code fonctionne:

df['veh'].value_counts()[df['veh'].value_counts() > 2]

La question est: pourquoi la partie [df['veh'].value_counts() > 2] vient juste après le "()" de value_counts()? Non "." ou tout autre signe de lien qui pourrait signifier quelque chose.

Si j'utilise le code

df['classi'].value_counts() > 1

(qui serait la syntaxe logique que mon cerveau limité peut résumer), il renvoie des valeurs booléennes.

Quelqu'un peut-il, s'il vous plaît, m'aider à comprendre la logique derrière les pandas?

Je suis à peu près sûr que les pandas sont géniaux et que le problème réside de mon côté, mais je veux vraiment le comprendre. J'ai lu beaucoup de matériel (documentation incluse), mais je n'ai pas pu trouver de solution à cette lacune.

Merci d'avance!

0
jaymzleutz 27 août 2020 à 19:13

2 réponses

Meilleure réponse

La ligne de code suivante

df['veh'].value_counts()

Renvoie une série de pandas avec des clés comme indices et le nombre d'occurrences comme valeurs

Tout ce qui est entre crochets [] sont des filtres sur les clés pour une série pandas. Donc

df['veh'].value_counts()['car']

Doit renvoyer le nombre d'occurrences du mot «voiture» dans la colonne «véh». Ce qui équivaut à la valeur correspondante pour la clé "voiture" sur la série df['veh'].value_counts()

Une série de pandas accepte également des listes de clés comme indices, donc

df['veh'].value_counts()[['car','boat']]

Devrait renvoyer le nombre d'occurrences pour les mots «voiture» et «bateau» respectivement

De plus, la série accepte une liste de booléens comme clé, si elle est de la même longueur que la série. Autrement dit, il accepte un masque booléen

Quand tu écris

df['veh'].value_counts() > 2

Vous faites une comparaison entre chaque valeur de df['veh'].value_counts() et le nombre 2. Cela renvoie un booléen pour chaque valeur, c'est-à-dire un masque booléen .

Vous pouvez donc utiliser le masque booléen comme filtre sur la série que vous avez créée. Donc

df['veh'].value_counts()[df['veh'].value_counts() > 2]

Renvoie toutes les occurrences des clés dont les occurrences sont supérieures à 2

1
Khanis Rok 27 août 2020 à 16:32

La logique est que vous pouvez découper une série avec une série booléenne de même taille:

s[bool_series]

Ou équivalent

s.loc[bool_series]

Ceci est également appelé indexation booléenne.

Maintenant, votre code équivaut à:

s = df['veh'].value_counts()

bool_series = s > 2

Et puis soit les deux premières lignes, par exemple s[s>2]

1
Quang Hoang 27 août 2020 à 16:21