【问题标题】:How to check if a particular cell in pandas DataFrame isnull?如何检查 pandas DataFrame 中的特定单元格是否为空?
【发布时间】:2017-08-12 19:24:23
【问题描述】:

我在熊猫中有以下df

0       A     B     C
1       2   NaN     8

如何检查 df.iloc[1]['B'] 是否为 NaN?

我尝试使用df.isnan(),得到一张这样的表格:

0       A     B      C
1   false  true  false

但我不确定如何为表编制索引,以及这是否是执行工作的有效方式?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果您在特定列中查找 NaN 的索引,您可以使用

    list(df['B'].index[df['B'].apply(np.isnan)])
    

    如果您要获取数据框中所有可能的 NaN 值的索引,您可以执行以下操作

    row_col_indexes = list(map(list, np.where(np.isnan(np.array(df)))))
    indexes = []
    for i in zip(row_col_indexes[0], row_col_indexes[1]):
        indexes.append(list(i))
    

    如果您正在寻找可以使用的单衬里:

    list(zip(*[x for x in list(map(list, np.where(np.isnan(np.array(df)))))]))
    

    【讨论】:

      【解决方案2】:

      jezrael 的反应很到位。如果您只关心 NaN 值,我正在探索是否有更快的选择,因为根据我的经验,对平面数组求和(奇怪地)比计数更快。这段代码似乎更快:

      df.isnull().values.any()
      

      例如:

      In [2]: df = pd.DataFrame(np.random.randn(1000,1000))
      
      In [3]: df[df > 0.9] = pd.np.nan
      
      In [4]: %timeit df.isnull().any().any()
      100 loops, best of 3: 14.7 ms per loop
      
      In [5]: %timeit df.isnull().values.sum()
      100 loops, best of 3: 2.15 ms per loop
      
      In [6]: %timeit df.isnull().sum().sum()
      100 loops, best of 3: 18 ms per loop
      
      In [7]: %timeit df.isnull().values.any()
      1000 loops, best of 3: 948 µs per loop
      

      【讨论】:

      • 这不会检查特定的单元格。
      • 如何检查特定单元格是否为 nan e,g df['colname'].values[0] 是否为空 如何检查此 pd.isnull - 根据值返回 bool 或数组是否为空或不为空,但在 if 条件下使用时抛出错误
      • 选择使用 loc 或 iloc:
      【解决方案3】:

      使用pd.isnull,供选择使用lociloc

      print (df)
         0  A   B  C
      0  1  2 NaN  8
      
      print (df.loc[0, 'B'])
      nan
      
      a = pd.isnull(df.loc[0, 'B'])
      print (a)
      True
      
      print (df['B'].iloc[0])
      nan
      
      a = pd.isnull(df['B'].iloc[0])
      print (a)
      True
      

      【讨论】:

      • 我试过这个,但我得到以下错误:TypeError: isnull() 只需要 1 个参数(给定 2 个)
      • 我写的是df.isnull(df['B'].iloc[0])而不是pd.isnull(df['B'].iloc[0])。谢谢你这解决了我的问题!
      猜你喜欢
      • 2013-11-18
      • 2018-05-06
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      相关资源
      最近更新 更多