pandas: データ フレームのインデックス作成中の複数の条件 - 非直感的な動作
複数の条件が関係する条件に基づいてデータ フレームから行を選択する場合列を使用すると、ユーザーは予期しない動作に遭遇する可能性があります。特に、OR 演算子と AND 演算子は、期待される役割とは逆に動作するようです。
次のコードを考えてみましょう:
<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>
結果:
<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>
観察されたとおりOR 演算子が使用される場合 (df2)、一方または両方の値が -1 である行は保持されますが、AND 演算子が使用される場合 (df1) は、値が -1 である行は破棄されます。この動作は直感的な期待と矛盾します。
説明
一見逆転した動作は、各オペレーターの状態で採用された観点から生じています。 AND 演算子の場合:
<code class="python">(df.a != -1) & (df.b != -1)</code>
この条件は、「df.a と df.b の両方が -1 ではない行を保持する」と解釈され、少なくとも 1 つの -1 値を持つ行を事実上除外します。
逆に、OR 演算子:
<code class="python">(df.a != -1) | (df.b != -1)</code>
「df.a または df.b のいずれかが -1 と異なる行を保持する」と解釈され、両方の値が -1 である行を事実上除外します。
したがって、この動作は、除外する行ではなく、保持する行を選択するという意図と一致しています。
連鎖アクセスに関する注意
コード スニペット dfセル値を変更するために ['a'][1] = -1 を使用することはお勧めできません。明確さと一貫性のために、代わりに df.loc[1, 'a'] = -1 または df.iloc[1, 0] = -1 を使用することをお勧めします。
以上がpandas のインデックス付けで OR 演算子を使用すると、値が -1 の行が保持されるのに、AND 演算子はそれらの行を破棄し、直感的な期待に反するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。