单括号中柱的pd.isna与多括号中柱的pd.isna有什么区别?它不返回多个括号中的na值

2024-09-20 04:03:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

因此,第一行返回3880行,运行时间为2.5ms,而第二行返回覆盖数据帧中的所有行,也需要3.08s。 这有什么原因吗?我如何避免这种情况,因为我必须将其配置为在第二个查询中传递多个列


Tags: 脚本iddataframe方式文章事情括号pd
2条回答

第一行代码是使用布尔值Series进行选择,而第二行代码是使用布尔值DataFrame进行选择,处理方式非常不同,因为数据帧是二维的,有两个轴需要对齐。有一节专门说明pandas docs中的这种差异

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

在使用布尔数据框进行选择的情况下,返回与原始对象形状相同的对象,其中保留布尔数据框中的True值,并将任何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

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

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

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

相关问题 更多 >