0

在编写专栏脚本时,我遇到了一些非常有趣的事情。我将 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 秒。发生这种情况有什么原因吗?我怎样才能避免这种情况,因为我必须使其可配置以在第二个查询中传递多个列?

4

2 回答 2

0

第一行代码是使用 Boolean 进行选择Series,而第二行是使用 Boolean 进行选择DataFrame,这些代码的处理方式非常不同,因为 DataFrame 是 2D 并且有 2 个轴要对齐。在pandas 文档中有一个部分专门用于说明这种差异。

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

在使用 Boolean DataFrame 进行选择的情况下,您返回一个与原始形状相同的对象,其中True保留了 Boolean DataFrame 中的值,并且任何False值都替换为NaN. (它实际上实现为DataFrame.where)对于没有出现在您的布尔数据框掩码中的行和列,它们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
于 2021-07-30T15:25:41.373 回答
0

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

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

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

于 2021-07-30T15:41:28.177 回答