熊猫的布尔运算与一次比较与多次比较不一致

时间:2018-11-12 17:16:54

标签: python pandas boolean-operations

我正在尝试过滤出数据框中的某些行(具有> 400000行),其中一列中的值具有“无”类型。目的是使数据框只保留“列”列中浮点值的行。我打算通过传入一个布尔数组来做到这一点,除了不能正确构造我的布尔数组(它们都返回True)。

当我运行以下操作时,给定i值在df范围内,则比较有效:

df.loc[i, 'Column'] != None 

“列”中值为“无”的行的结果为False。

但是当我运行此操作时:

df.loc[0:len(df), 'Column'] != None 

布尔数组作为所有True返回。

这是为什么?这是熊猫虫吗?边缘情况?出于不明原因的预期行为?

我可以想到其他方法来构造布尔数组,尽管这似乎是最有效的。但这令我困扰,这是我得到的结果。

1 个答案:

答案 0 :(得分:3)

以下是您所看到的内容的可复制示例:

x = pd.Series([1, None, 3, None, None])

print(x != None)

0    True
1    True
2    True
3    True
4    True
dtype: bool

Pandas将您的系列转换为数字并将这些None的值转换为np.nan的背后是什么?

print(x)

0    1.0
1    NaN
2    3.0
3    NaN
4    NaN
dtype: float64

该系列下面的NumPy数组可以保存在连续的内存块中,并支持矢量化操作。从np.nan != np.nan by design开始,即使您要针对True而不是np.nan进行测试,您的布尔系列也将仅包含None值。

出于效率和正确性的考虑,应将pd.to_numericisnull / notnull结合使用以检查空值:

print(pd.to_numeric(x, errors='coerce').notnull())

0     True
1    False
2     True
3    False
4    False
dtype: bool