在Pandas数据框中计算np.nan的数量

4

我有一个包含 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”循环,因为我预计在更大的数据框上速度会非常慢。任何帮助将不胜感激!
2个回答

4
您可以使用 Series.notnaSeries.cumsum 检测非缺失值并创建组,然后过滤仅包含 NaN 的行,接着通过 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

0

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

field1.isna().sum()

这相当于取列的长度减去计数(这将排除NaN)。
len(df'field1') - df.count()

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

len(df) - df.count()

针对行,你可以使用 axis=1

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

他想要行中的值,如果我理解正确的话。 - U13-Forward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接