【问题标题】:Count number of np.nan in a Pandas dataframe计算 Pandas 数据框中 np.nan 的数量
【发布时间】:2021-01-04 08:05:37
【问题描述】:

我有一个包含 np.nan(Numpy 非数字)值的 Pandas 数据框:

            field1
2020-12-24  NaN
2020-12-25  NaN
2020-12-26  1.0
2020-12-27  2.0
2020-12-28  NaN
2020-12-29  1.0
2020-12-30  2.0

(索引是日期时间。) 我想获得一个新的数据框,其中包含开始日期和 np.nan 发生的次数,即

            field1
2020-12-24  2
2020-12-28  1

我试过这段代码:

prev = 1
for col_name, el in df.iterrows():
    print(el)
    if prev != np.nan and el[0] == np.nan:
        cnt = 1
    if prev == np.nan and el[0] == np.nan:
        cnt = cnt + 1
    if prev == np.nan and el[0] != np.nan:
        print(cnt)
    prev = el[0]

但它没有按预期工作,而且我想避免“for”循环,因为我希望它们在更大的数据帧上非常慢。任何帮助将不胜感激!

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

    您可以通过Series.notnaSeries.cumsum 测试非缺失值来创建组,然后仅过滤NaNs 行,然后通过Series.mapSeries.value_counts 获取计数并通过Series.duplicated 过滤第一个重复的行:

    m = df['field1'].notna()
    s = m.cumsum()[~m]
    
    df1 = s.map(s.value_counts())[~s.duplicated()].to_frame()
    print (df1)
                field1
    2020-12-24       2
    2020-12-28       1
    

    【讨论】:

      【解决方案2】:

      你可以在列上使用isna()的总和:

      field1.isna().sum()
      

      这相当于将列的长度减去计数(将排除NaN's)

      len(df'field1') - df.count()
      

      因此,您可以使用以下命令计算数据库中的所有Nan

      len(df) - df.count()
      

      对于行,您可以使用axis=1:

      df.isna().sum(axis=1)
      

      【讨论】:

      • 他想要 IIUC 行中的值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多