统计Dataframe每列中非NaN值的数量

127

我有一个非常大的 DataFrame,想知道是否有一种简短的(一两行代码)方法来获取 DataFrame 中非 NaN 条目的计数。我不想逐列执行此操作,因为我有接近 1000 列。

df1 = pd.DataFrame([(1,2,None),(None,4,None),(5,None,7),(5,None,None)], 
                    columns=['a','b','d'], index = ['A', 'B','C','D'])

    a   b   d
A   1   2 NaN
B NaN   4 NaN
C   5 NaN   7
D   5 NaN NaN

输出:

a: 3
b: 2
d: 1

1
df1[df1.notnull()].count() 这似乎已经起作用了。 - cryp
3
df1.notnull() 的额外索引不必要,因为 count 函数已经忽略了空值。 - Alex Riley
1
series.value_counts(..., dropna=False) 不同的是,df.count() 没有直接获取 NA 计数的选项。 - smci
4个回答

204

count() 方法返回每列中非 NaN 值的数量:

>>> df1.count()
a    3
b    2
d    1
dtype: int64

同样地,count(axis=1)返回每行中非NaN值的数量。


如果该列具有字符串,我不相信那会有效。 - DISC-O
@DISC-O:我刚试了一下,在我的电脑上可以运行(pandas版本为1.2.1)。例如,df = pd.DataFrame({"a": ["x", np.nan, "z"]}),然后 df.count() 会产生预期的值 2。你有一个这个方法无法正常工作的例子吗? - Alex Riley
2
是的,如果您手动创建DataFrame并放置np.nan,那么可能可以工作。但这不是您通常创建列的方式。我经常使用的一种方法是:df ['C'] = np.where(df.A> df.B,'some text',np.nan)。这将np.nan转换为“nan”,不再被识别为nan。 - DISC-O
我有一个包含None值的列,这不起作用。 - West
@DISC-O(非常晚的回复,抱歉)- 在该示例中,您不会在列中得到任何NaN值(您有一列字符串值),因此.count()方法按预期工作。一些NumPy方法,特别是与字符串相关的方法,与pandas不兼容,这就是其中之一,因此最好使用pandas方法,例如df["C"] = (df.A > df.B).map({True: 'some text', False: np.nan}) - Alex Riley
@West:.count() 应该将 None 视为 null 值并计数 - 如果您提供一个示例,我很乐意进行调试。 - Alex Riley

8
如果您想对不是NAN的总计数值进行求和,可以这样做:
np.sum(df.count())

4

如果您正在处理空字符串,您可能也希望将它们视为NA:

df.replace('', np.nan).count()

如果您还想删除空字符串:

df.replace(r'^\s*$', np.nan, regex=True).count()

4
您可以使用方法 notna / notnullsum
df.notna().sum()

输出:

a    3
b    2
d    1
dtype: int64

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