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[]
,您将要求重复获取索引 0
和 4
,或者如果您直接使用 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
我有一个数据框,其中 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
知道您可以根据二进制模式对 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[]
,您将要求重复获取索引 0
和 4
,或者如果您直接使用 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