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

Pandas boolean operations are inconsistent with one comparison vs. many comparisons

我正在尝试过滤掉我的数据框中的某些行(> 400000 行),其中一列中的值具有 None 类型。目标是让我的数据框只包含在 'Column' 列中具有浮动值的行。我计划通过传入一个布尔值数组来执行此操作,除了我无法正确构建我的布尔值数组(它们都返回 True)。

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

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

'Column' 中值为 None 的行给出结果 False。

但是当我运行这个操作时:

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

返回的布尔数组全部为 True。

这是为什么?这是 pandas 错误吗?边缘案例?出于我不明白的原因的预期行为?

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

这是您所看到的可重现示例:

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_numeric with isnull / notnull 来检查空值:

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

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