如何计算 pandas DataFrame 中的 nan 值?

Posted

技术标签:

【中文标题】如何计算 pandas DataFrame 中的 nan 值?【英文标题】:How to count nan values in a pandas DataFrame? 【发布时间】:2016-04-04 20:55:53 【问题描述】:

在 pandas DataFrame 中计算(不是数字)nan 值的最佳方法是什么?

以下代码:

import numpy as np
import pandas as pd
dfd = pd.DataFrame([1, np.nan, 3, 3, 3, np.nan], columns=['a'])
dfv = dfd.a.value_counts().sort_index()
print("nan: %d" % dfv[np.nan].sum())
print("1: %d" % dfv[1].sum())
print("3: %d" % dfv[3].sum())
print("total: %d" % dfv[:].sum())

输出:

nan: 0
1: 1
3: 3
total: 4

而期望的输出是:

nan: 2
1: 1
3: 3
total: 6

我在 Python 3.5.0 和 Anaconda 2.4.0 中使用 pandas 0.17。

【问题讨论】:

【参考方案1】:

只计算空值,你可以使用isnull()

In [11]:
dfd.isnull().sum()

Out[11]:
a    2
dtype: int64

这里a是列名,该列中出现了2次空值。

【讨论】:

这是更简单的方法【参考方案2】:

如果您只想计算 DataFrame df 的列 'a' 中的 NaN 值,请使用:

len(df) - df['a'].count()

这里count() 告诉我们非NaN 值的数量,这是从值的总数中减去的(由len(df) 给出)。

要计算df每个 列中的 NaN 值,请使用:

len(df) - df.count()

如果你想使用value_counts,告诉它不要通过设置dropna=False(在0.14.1中添加)删除NaN值:

dfv = dfd['a'].value_counts(dropna=False)

这也允许计算列中的缺失值:

 3     3
NaN    2
 1     1
Name: a, dtype: int64

然后,您的其余代码应该可以按预期工作(请注意,不必调用 sum;只需 print("nan: %d" % dfv[np.nan]) 就足够了)。

【讨论】:

并且使用上面的方法后 dfv.values.sum() 统计所有的值,即 6 谢谢。 ;) 没问题!是的,这行得通。事实上,你可以写dfv.sum() 来计算所有的值。或者更高效,只需查看len(dfd)【参考方案3】:

在数据框的所有列中计算所有 NaN 的好方法是 ...

import pandas as pd 
import numpy as np


df = pd.DataFrame('a':[1,2,np.nan], 'b':[np.nan,1,np.nan])
print(df.isna().sum().sum())

使用单个总和,您可以获得每列的 NaN 计数。第二个总和,对这些列的总和求和。

【讨论】:

【参考方案4】:

如果你只想要每一列的空值的摘要,使用下面的代码 df.isnull().sum() 如果您想使用以下代码知道数据框中有多少空值 df.isnull().sum().sum() # calculate total

【讨论】:

【参考方案5】:

另一种计算 所有 df 中的 nan 的方法:

num_nans = df.size - df.count().sum()

时间安排:

import timeit

import numpy as np
import pandas as pd

df_scale = 100000
df = pd.DataFrame(
    [[1, np.nan, 100, 63], [2, np.nan, 101, 63], [2, 12, 102, 63],
     [2, 14, 102, 63], [2, 14, 102, 64], [1, np.nan, 200, 63]] * df_scale,
    columns=['group', 'value', 'value2', 'dummy'])

repeat = 3
numbers = 100

setup = """import pandas as pd
from __main__ import df
"""

def timer(statement, _setup=None):
    print (min(
        timeit.Timer(statement, setup=_setup or setup).repeat(
            repeat, numbers)))

timer('df.size - df.count().sum()')
timer('df.isna().sum().sum()')
timer('df.isnull().sum().sum()')

打印:

3.998805362999999
3.7503365439999996
3.689461442999999

差不多的

【讨论】:

【参考方案6】:

这个最适合我!

如果您想获得一个简单的摘要使用(非常适合数据科学计算缺失值及其类型):

df.info(verbose=True, null_counts=True)

或者另一个很酷的是:

df['<column_name>'].value_counts(dropna=False)

示例:

df = pd.DataFrame('a': [1, 2, 1, 2, np.nan],
   ...:                    'b': [2, 2, np.nan, 1, np.nan],
   ...:                    'c': [np.nan, 3, np.nan, 3, np.nan])

这是df:

    a    b    c
0  1.0  2.0  NaN
1  2.0  2.0  3.0
2  1.0  NaN  NaN
3  2.0  1.0  3.0
4  NaN  NaN  NaN

运行信息:

df.info(verbose=True, null_counts=True)
   ...:
<class 'pandas.core.frame.DataFrame'>

RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
a    4 non-null float64
b    3 non-null float64
c    2 non-null float64
dtypes: float64(3)

所以你看到对于 C,你在 5 行中有 2 个非空值,b/c 你在行有空值:[0,2,4]

这就是你对每一列使用 value_counts 得到的结果:

In [17]: df['a'].value_counts(dropna=False)
Out[17]:
 2.0    2
 1.0    2
NaN     1
Name: a, dtype: int64

In [18]: df['b'].value_counts(dropna=False)
Out[18]:
NaN     2
 2.0    2
 1.0    1
Name: b, dtype: int64

In [19]: df['c'].value_counts(dropna=False)
Out[19]:
NaN     3
 3.0    2
Name: c, dtype: int64

【讨论】:

【参考方案7】:
dfd['a'].isnull().value_counts()

返回:

(真695 假 60, 名称:a,dtype:int64)
True : 表示空值计数 False : 表示非空值计数

【讨论】:

欢迎来到 Stack Overflow。在回答已接受答案的旧问题(寻找绿色✓)以及其他答案之前,请确保您的答案添加了新内容或对它们有帮助。这是How to Answer 的指南。

以上是关于如何计算 pandas DataFrame 中的 nan 值?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas-Dataframe:如何计算变量在 1 分钟内重复的次数

如何在 Pandas DataFrame 上计算滚动累积乘积

pandas使用unique函数计算dataframe单个数据列中的独特值或者计算dataframe多个数据列的独特值(get unique values of column or columns)

如何使用 pandas DataFrame 计算列表的字典?

当在应用中也计算前一个值时,Pandas 中是不是可以使用 dataframe.apply 中的前一行值?

计算 Pandas 数据框中的平均真实范围列 [重复]