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
Libérer: 2024-10-26 05:47:31
original
974 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal