Maison >développement back-end >Tutoriel Python >Pourquoi l'utilisation de l'opérateur OR dans l'indexation pandas conserve-t-elle les lignes avec des valeurs -1, alors que l'opérateur AND les supprime, contredisant les attentes intuitives ?

Pourquoi l'utilisation de l'opérateur OR dans l'indexation pandas conserve-t-elle les lignes avec des valeurs -1, alors que l'opérateur AND les supprime, contredisant les attentes intuitives ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 05:47:31988parcourir

Why does using the OR operator in pandas indexing retain rows with -1 values, while the AND operator discards them, contradicting intuitive expectations?

pandas : conditions multiples lors de l'indexation d'un bloc de données - Comportement non intuitif

Lors de la sélection de lignes dans un bloc de données en fonction de conditions impliquant plusieurs colonnes, les utilisateurs peuvent rencontrer un comportement inattendu. En particulier, les opérateurs OR et AND semblent se comporter à l'inverse de leurs rôles attendus.

Considérez le code suivant :

<code class="python">import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5) })

# Insert -1 values
df.loc[1, 'a'] = -1
df.loc[1, 'b'] = -1
df.loc[3, 'a'] = -1
df.loc[4, 'b'] = -1

df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]

df_combined = pd.concat([df, df1, df2], axis=1, keys=['Original', 'AND', 'OR'])

print(df_combined)</code>

Résultats :

<code class="python">   Original  AND  OR
    a  b  a  b  a  b
0   0  0  0  0  0  0
1  -1 -1  NaN NaN  NaN NaN
2   2  2  2  2  2  2
3  -1  3  NaN NaN -1  3
4   4 -1  NaN NaN  4 -1</code>

Comme observé , les lignes dont l'une ou les deux valeurs sont -1 sont conservées lorsque l'opérateur OR est utilisé (df2), tandis que les lignes avec n'importe quelle valeur -1 sont supprimées lorsque l'opérateur AND est utilisé (df1). Ce comportement contredit les attentes intuitives.

Explication

Le comportement apparemment inversé découle de la perspective adoptée dans la condition de chaque opérateur. Pour l'opérateur AND :

<code class="python">(df.a != -1) & (df.b != -1)</code>

La condition se lit comme suit : "conserver les lignes où df.a et df.b diffèrent de -1", excluant ainsi les lignes avec au moins une valeur -1.

À l'inverse, l'opérateur OR :

<code class="python">(df.a != -1) | (df.b != -1)</code>

Se lit comme "conserver les lignes où df.a ou df.b diffère de -1", excluant ainsi les lignes où les deux valeurs sont -1.

Ainsi, le comportement s'aligne sur l'intention de sélectionner les lignes à conserver, plutôt que celles à exclure.

Remarque sur l'accès chaîné

L'extrait de code df ['a'][1] = -1 pour modifier les valeurs des cellules n'est pas conseillé. Pour plus de clarté et de cohérence, il est recommandé d'utiliser plutôt df.loc[1, 'a'] = -1 ou df.iloc[1, 0] = -1.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn