我有一个 pandas.DataFrame 对象,其中包含大约 100 列和 200000 行数据。我正在尝试将其转换为 bool 数据框,其中 True 表示该值大于阈值,False 表示它小于阈值,并且保留 NaN 值。
如果没有 NaN 值,我需要大约 60 毫秒才能运行:
df >= threshold
但是当我尝试处理 NaN 时,下面的方法有效,但速度很慢(20 秒)。
def func(x):
if x >= threshold:
return True
elif x < threshold:
return False
else:
return x
df.apply(lambda x: x.apply(lambda x: func(x)))
有没有更快的方法?
最佳答案
你可以这样做:
new_df = df >= threshold
new_df[df.isnull()] = np.NaN
但这与您使用 apply 方法获得的结果不同。这里你的面具有包含 NaN、0.0 和 1.0 的 float dtype。在 apply 解决方案中,您将获得具有 NaN、False 和 True 的 object
dtype。
两者都不能用作面具,因为您可能得不到想要的东西。 IEEE 表示任何 NaN 比较都必须产生 False,而 apply 方法通过返回 NaN 隐含地违反了这一点!
最好的选择是单独跟踪 NaN,并且在安装瓶颈时 df.isnull() 非常快。
关于python - 使用 pandas 数据帧不等式保持 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33783027/