如何计算pandas DataFrame中的nan值?

时间:2015-12-30 20:50:42

标签: python python-3.x pandas dataframe nan

在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

我使用pandas 0.17和Python 3.5.0与Anaconda 2.4.0。

7 个答案:

答案 0 :(得分:19)

要仅计算空值,您可以使用isnull()

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

Out[11]:
a    2
dtype: int64

此处a是列名,并且列中出现2次空值。

答案 1 :(得分:11)

如果您只想计算DataFrame scala> object Test { | def produces(f: String => Any): Boolean = true | def produces(x: () => Any): Boolean = false | } defined object Test scala> Test.produces(x => 5) res9: Boolean = true scala> Test.produces(5) <console>:12: error: overloaded method value produces with alternatives: (x: () => Any)Boolean <and> (f: String => Any)Boolean cannot be applied to (Int) Test.produces(5) ^ scala> Test.produces(() => 5) res11: Boolean = false 的{​​{1}}列中的NaN值,请使用:

'a'

此处df告诉我们非NaN值的数量,并从值的总数中减去(由len(df) - df['a'].count() 给出)。

要计算count()每个列中的NaN值,请使用:

len(df)

如果您想使用df,请设置len(df) - df.count() (在0.14.1中添加),告诉删除NaN值:

value_counts

这样也可以计算列中的缺失值:

dropna=False

您的其余代码应该按预期工作(请注意,无需调用dfv = dfd['a'].value_counts(dropna=False) ;只需 3 3 NaN 2 1 1 Name: a, dtype: int64 就足够了。

答案 2 :(得分:1)

一种很好的干净方法来计算数据框所有列中的所有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计数。第二个总和,将这些列总和求和。

答案 3 :(得分:1)

另一种计算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

非常等效

答案 4 :(得分:0)

如果只希望每列的空值汇总,请使用以下代码     df.isnull().sum() 如果您想使用以下代码了解数据框中有多少个空值    df.isnull().sum().sum() # calculate total

答案 5 :(得分:0)

这个最适合我!

如果您想获得一个简单的摘要用途(对于数据科学来说,很重要的就是可以计算缺失值及其类型):

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]处为null

这是您对每一列使用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

答案 6 :(得分:0)

dfd['a'].isnull().value_counts()

返回:

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