python - Pandas bool 运算在一次比较与多次比较中不一致

标签 python pandas boolean-operations

我试图过滤掉数据框中的一些行(超过 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_numericisnull/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/

相关文章:

java - 如何将文本输入与多个字符串进行比较?

python - 动态导入模块以在 lambda 表达式中使用

python - __new__ 在 python 中的奇怪行为

java - 斯坦福解析器 - java.io.IOException : Unable to resolve as either class path, 文件名或 URL

python - 转换为_datetime但保留原始时间

python - 通过多索引的子集从 pandas 中选择行

Python Pandas 使用正则表达式从包含字符串的列中提取单词

VBA:为什么 Not 运算符会停止工作?

python - numpy 数组的逐元素逻辑比较

python - 为什么 [0] 是一个不同的函数而 0 不是?