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!