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
我正在尝试过滤掉我的数据框中的某些行(> 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