python - pandas获取索引 - pandas行列索引




pandas:索引数据框时的多个条件-意外行为 (2)

我通过两列中的值过滤数据框中的行。

由于某种原因,OR运算符的行为与我期望AND运算符的行为相反,反之亦然。

我的测试代码:

import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5) })

# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1

df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]

print pd.concat([df, df1, df2], axis=1,
                keys = [ 'original df', 'using AND (&)', 'using OR (|)',])

结果如下:

      original df      using AND (&)      using 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

[5 rows x 6 columns]

如您所见, AND运算符会删除其中至少有一个值等于-1每一行。 另一方面, OR运算符要求两个值都等于-1才能删除它们。 我希望完全相反的结果。 有人能解释一下这种行为吗?

我正在使用熊猫0.13.1。


如您所见,AND运算符会删除其中至少有一个值等于-1的每一行。 另一方面,OR运算符要求两个值都等于-1才能删除它们。

那就对了。 请记住,您根据自己想要保留的内容来编写条件,而不是根据要删除的内容。 对于df1

df1 = df[(df.a != -1) & (df.b != -1)]

你说的是“保留df.a不是-1而df.b不是-1的行”,这与丢弃其中至少有一个值为-1的每一行相同。

对于df2

df2 = df[(df.a != -1) | (df.b != -1)]

你说“保留df.adf.b不是-1的行”,这与删除两个值为-1的行相同。

PS:像df['a'][1] = -1这样的链接访问会让你陷入困境。 养成使用.loc.iloc的习惯更好。


你可以使用query() ,即:

df_filtered = df.query('a == 4 & b != 2')






boolean-logic