【问题标题】: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.isna 有什么区别?它不会在多个括号中返回 na 值
【发布时间】:2021-07-30 15:15:37
【问题描述】:

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

【问题讨论】:

  • override.ORIGINAL_CREDITOR_IDpandas.Seriesoverride[['ORIGINAL_CREDITOR_ID']]pandas.DataFrame

标签: python pandas numpy missing-data isnan


【解决方案1】:

第一行代码是使用布尔值 Series 进行选择,而第二行是使用布尔值 DataFrame 进行选择,它们的处理方式非常不同DataFrames 是 2D 的,有 2 个轴要对齐。 pandas docs 中有一个部分专门说明了这种差异。

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

在使用 Boolean DataFrame 进行选择的情况下,您会返回一个与原始对象形状相同的对象,其中保留了 Boolean DataFrame 中的 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

【讨论】:

  • 知道了,这真的很有帮助。那么有没有一种方法可以根据两列过滤 nans,还是必须通过去掉 nans 值来过滤?
  • @thisismihir 您可以在两列中查找NaN,然后仍然折叠成一个系列。因此,如果您想要在任一列中包含 NaN 的行,您可以执行以下操作:df[df[['col1', 'col2']].isnull().any(1)],使用 .any(axis=1) 将 DataFrame 掩码折叠为系列掩码,询问该行是否在任何这些列中有空值。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2012-02-12
    • 2016-06-26
    • 2014-04-18
    • 2021-05-16
    • 2021-05-12
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多