Pandas: Mehrere Bedingungen beim Indizieren eines Datenrahmens – nicht intuitives Verhalten
Beim Auswählen von Zeilen aus einem Datenrahmen basierend auf Bedingungen, die mehrere umfassen Spalten können Benutzer auf unerwartetes Verhalten stoßen. Insbesondere scheinen sich die OR- und AND-Operatoren entgegengesetzt zu ihren erwarteten Rollen zu verhalten.
Betrachten Sie den folgenden Code:
<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>
Ergebnisse:
<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>
Wie beobachtet , Zeilen, in denen einer oder beide Werte -1 sind, bleiben erhalten, wenn der ODER-Operator verwendet wird (df2), während Zeilen mit einem beliebigen -1-Wert verworfen werden, wenn der UND-Operator verwendet wird (df1). Dieses Verhalten widerspricht intuitiven Erwartungen.
Erklärung
Das scheinbar umgekehrte Verhalten ergibt sich aus der Perspektive, die im jeweiligen Zustand des Bedieners eingenommen wird. Für den AND-Operator:
<code class="python">(df.a != -1) & (df.b != -1)</code>
Die Bedingung lautet „Zeilen beibehalten, in denen sich sowohl df.a als auch df.b von -1 unterscheiden“, wodurch Zeilen mit mindestens einem -1-Wert effektiv ausgeschlossen werden.
Umgekehrt gilt für den OR-Operator:
<code class="python">(df.a != -1) | (df.b != -1)</code>
Leseweise „Zeilen beibehalten, in denen entweder df.a oder df.b von -1 abweicht“, wodurch Zeilen effektiv ausgeschlossen werden, in denen beide Werte -1 sind.
Daher steht das Verhalten im Einklang mit der Absicht, Zeilen zum Beibehalten und nicht zum Ausschließen auszuwählen.
Hinweis zum verketteten Zugriff
Der Codeausschnitt df ['a'][1] = -1 zum Ändern von Zellwerten ist nicht ratsam. Aus Gründen der Klarheit und Konsistenz wird empfohlen, stattdessen df.loc[1, 'a'] = -1 oder df.iloc[1, 0] = -1 zu verwenden.
Das obige ist der detaillierte Inhalt vonWarum behält die Verwendung des OR-Operators bei der Pandas-Indizierung Zeilen mit -1-Werten bei, während der AND-Operator sie verwirft, was im Widerspruch zu intuitiven Erwartungen steht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!