我试图过滤掉数据框中的一些行(超过 400000 行),其中一列中的值具有 None 类型。目标是让我的数据框仅包含具有在“列”列中 float 的值的行。我计划通过传递一个 bool 值数组来完成此操作,但我无法正确构造我的 bool 值数组(它们都返回 True)。
当我运行以下操作时,给定 df 范围内的 i 值,比较有效:
df.loc[i, 'Column'] != None
“Column”中值为 None 的行给出的结果为 False。
但是当我运行此操作时:
df.loc[0:len(df), 'Column'] != None
bool 数组返回时全部为 True。
这是为什么呢?这是 Pandas 的错误吗?边缘情况?出于我不明白的原因的预期行为?
我可以想出其他方法来构造我的 bool 数组,尽管这似乎是最有效的。但令我困扰的是,这就是我得到的结果。
最佳答案
这是您所看到的可重现示例:
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 ,您的 bool 系列将仅包含 True
值,即使您要针对 np.nan
而不是 None
进行测试。
为了提高效率和正确性,您应该使用 pd.to_numeric
与 isnull
/notnull
用于检查空值:
print(pd.to_numeric(x, errors='coerce').notnull())
0 True
1 False
2 True
3 False
4 False
dtype: bool
关于python - Pandas bool 运算在一次比较与多次比较中不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53267064/