单括号和多括号中的列的 pd.isna 有什么区别?它不会在多个括号中返回 na 值

问题描述

在编写专栏脚本时,我遇到了一些非常有趣的事情。我将 pd.DataFrame.isna 用于单列和多列的方式有两种。当我在多个括号中编写脚本时,pd.df.isna 将整个代码返回给我。

override[override.ORIGINAL_CREDITOR_ID.notna()].shape

override[override[['ORIGINAL_CREDITOR_ID']].notna()].shape

所以第一行返回 3880 行并在 2.5 毫秒内运行,而第二行返回覆盖数据框中存在的所有行,这也需要 3.08 秒。 有什么原因吗?我如何避免这种情况,因为我必须使其可配置以在第二个查询中传递多列?

解决方法

第一行代码是带有布尔值Series的选择,而第二行代码是带有布尔值DataFrame的选择,这些是由于 DataFrame 是 2D 并且有 2 个轴要对齐,因此处理方式非常不同。有一节专门用于说明 pandas docs 中的这种差异。

在第一种情况下,选择布尔系列,您只返回布尔系列中 True 行的所有列。

在使用 Boolean DataFrame 进行选择的情况下,您将返回一个与原始形状相同的对象,其中保留了 Boolean DataFrame 中的 True 值,并且所有 False 值都替换为 {{ 1}}。 (它实际上实现为 NaN)对于没有出现在您的 Boolean DataFrame 掩码中的行和列,这些默认情况下变为 DataFrame.where

NaN
,

所以,我找到了一种方法,一旦我获得了 True 和 False 的数据帧,我就可以使用 all 或 any 进行按位运算。可以参考:

override[override[['ORIGINAL_CREDITOR_ID']].notna().all(1)].shape

这将帮助我过滤我想要的结果,而且速度要快得多,即在 8 毫秒内。 我在 here 上找到了这个答案。所以希望你觉得这很有用。如果您需要更多了解,请告诉我。