ホームページ >バックエンド開発 >Python チュートリアル >pandas のインデックス付けで OR 演算子を使用すると、値が -1 の行が保持されるのに、AND 演算子はそれらの行を破棄し、直感的な期待に反するのはなぜですか?

pandas のインデックス付けで OR 演算子を使用すると、値が -1 の行が保持されるのに、AND 演算子はそれらの行を破棄し、直感的な期待に反するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 05:47:31995ブラウズ

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

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。