pd.isna 对于单括号和多括号中的列有什么区别?它不会 return 多个括号中的值

What is the difference between pd.isna for columns in single bracket vs multiple bracket? It does not return na values in multiple brackets

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

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

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

所以第一行 returns 我有 3880 行,运行时间为 2.5 毫秒,而第二行 returns 我是覆盖数据框中的所有行,也需要 3.08 秒。 发生这种情况有原因吗?我怎样才能避免这种情况,因为我必须使其可配置以在第二个查询中传递多个列?

第一行代码是使用布尔值Series进行选择,而第二行代码是使用布尔值DataFrame[进行选择=28=],这些处理方式非常不同,因为 DataFrame 是 2D 并且有 2 个轴要对齐。 pandas docs.

中有一节专门说明这种差异

在第一种情况下,使用布尔系列进行选择,您 return 所有列仅用于布尔系列中 True 的行。

在使用布尔数据帧进行选择的情况下,您 return 一个与原始形状相同的对象,其中保留了布尔数据帧中的 True 值,并且任何 False值替换为 NaN。 (它实际上实现为 DataFrame.where)对于未出现在 Boolean DataFrame 掩码中的行和列,默认情况下变为 NaN

import pandas as pd
df = pd.DataFrame({'a': [1, 2, np.NaN, 4],
                   'b': [10, 11, 12, 13]})

# Boolean Series, return all columns only for for rows where condition is True
df[df['a'] == 2]
#     a   b
#1  2.0  11


# Boolean DataFrame, equivalent to df.where(df[['a']] == 2)
df[df[['a']] == 2]
#     a   b
#0  NaN NaN
#1  2.0 NaN
#2  NaN NaN
#3  NaN NaN

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

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

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