Pandas: 检查二进制标志模式时出错

Pandas: eror when checking for a binary flag pattern

我有一个数据框,其中 int 类型的列之一存储二进制标志模式:

import pandas as pd

df = pd.DataFrame({'flag': [1, 2, 4, 5, 7, 3, 9, 11]})

我尝试 select 以通常的方式(使用二进制和运算符)处理值匹配 4 的行:

df[df['flag'] & 4]

但它失败了:

KeyError: "None of [Int64Index([0, 0, 4, 4, 4, 0, 0, 0], dtype='int64')] are in the [columns]"

实际上如何 select 行匹配二进制模式?

即使在 Pandas but at the same time using a Series as an argument to allegedly logical operator results not in a Series of Boolean values but numbers.

知道您可以根据二进制模式对 select 行使用以下任何方法:

  • 因为 <int> & <FLAG> 的结果总是 <FLAG> 那么你可以使用:

    df[df['flag'] & 4 == 4]
    

其中(由于运算符的优先级)计算为:

  df[(df['flag'] & 4) == 4]
  • 或者您可以使用 apply 并将结果直接映射到 bool:

    df[df['flag'].apply(lambda v: bool(v & FLAG))]
    

但这看起来确实很麻烦,而且可能会慢很多。

无论哪种情况,结果都符合预期:

    flag
2   4
3   5
4   7

bitwise-flag 选择如您所愿:

>>> df['flag'] & 4
0    0
1    0
2    4
3    4
4    4
5    0
6    0
7    0
Name: flag, dtype: int64

然而,如果您将其传递给 df.loc[],您将要求重复获取索引 04,或者如果您直接使用 df[],您重新要求具有 Int64Index[...] 作为列 header 的列。

相反,您应该强制转换为布尔索引器:

>>> (df['flag'] & 4) != 0
0    False
1    False
2     True
3     True
4     True
5    False
6    False
7    False
Name: flag, dtype: bool
>>> df[(df['flag'] & 4) != 0]
   flag
2     4
3     5
4     7