我正在尝试过滤出数据框中的某些行(具有> 400000行),其中一列中的值具有“无”类型。目的是使数据框只保留“列”列中浮点值的行。我打算通过传入一个布尔数组来做到这一点,除了不能正确构造我的布尔数组(它们都返回True)。
当我运行以下操作时,给定i值在df范围内,则比较有效:
df.loc[i, 'Column'] != None
“列”中值为“无”的行的结果为False。
但是当我运行此操作时:
df.loc[0:len(df), 'Column'] != None
布尔数组作为所有True返回。
这是为什么?这是熊猫虫吗?边缘情况?出于不明原因的预期行为?
我可以想到其他方法来构造布尔数组,尽管这似乎是最有效的。但这令我困扰,这是我得到的结果。
答案 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_numeric
与isnull
/ notnull
结合使用以检查空值:
print(pd.to_numeric(x, errors='coerce').notnull())
0 True
1 False
2 True
3 False
4 False
dtype: bool