2014-10-08 189 views

回答

40

你可以从非NaN值的count减去总长度:

count_nan = len(df) - df.count() 

你应该火候上的数据。与isnull解决方案相比,小型系列的速度提高了3倍。

+1

事实上,最好的一次。这取决于我认为的帧的大小,对于更大的帧(3000行),使用'isnull'的速度已经快了两倍。 – joris 2014-10-08 21:12:10

+4

在我计算群体长度大于​​4的情况下,我尝试了两种方法,并且joris'df.isnull()。sum()的速度至少快了20倍。这是0.17.1。 – 2016-03-16 16:49:07

279

您可以使用isnull()方法,然后求和以计算nan值。对于一列:

In [1]: s = pd.Series([1,2,3, np.nan, np.nan]) 

In [4]: s.isnull().sum() 
Out[4]: 2 

几列,它也可以工作:

In [5]: df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]}) 

In [6]: df.isnull().sum() 
Out[6]: 
a 1 
b 2 
dtype: int64 
+12

@ user3799307:你应该接受这个答案。 – hlin117 2016-02-02 05:20:19

+0

@ user3799307 ^^^^ – denvar 2016-05-16 16:24:38

+0

@ user379937他们说的。有没有别的办法,管理员可以接受吗?乍一看,我错过了这一点,并在返回之前用'value_counts'搞砸了。 – josh 2016-06-15 15:34:18

19

由于大熊猫0.14.1我的建议here有在value_counts方法的关键字参数已经实现:

import pandas as pd 
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]}) 
for col in df: 
    print df[col].value_counts(dropna=False) 

2  1 
1  1 
NaN 1 
dtype: int64 
NaN 2 
1  1 
dtype: int64 
+0

到目前为止的最佳答案,它还允许对其他值类型进行计数。 – gaborous 2018-02-17 02:46:25

14

如果您使用的是Jupyter笔记本,那么......

%%timeit 
df.isnull().any().any() 

%timeit 
df.isnull().values.sum() 

,或者是否有任何地方的NaN中的数据,如果有,在哪里?

df.isnull().any() 
14

基于最投票的答案,我们可以很容易地定义一个函数,给了我们一个数据帧预览缺失值,并在每一列的缺失值%:

def missing_values_table(df): 
     mis_val = df.isnull().sum() 
     mis_val_percent = 100 * df.isnull().sum()/len(df) 
     mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1) 
     mis_val_table_ren_columns = mis_val_table.rename(
     columns = {0 : 'Missing Values', 1 : '% of Total Values'}) 
     mis_val_table_ren_columns = mis_val_table_ren_columns[ 
      mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(
     '% of Total Values', ascending=False).round(1) 
     print ("Your selected dataframe has " + str(df.shape[1]) + " columns.\n"  
      "There are " + str(mis_val_table_ren_columns.shape[0]) + 
       " columns that have missing values.") 
     return mis_val_table_ren_columns 
9

如果只是算nan值在这里是一个快速的方式

import pandas as pd 
## df1 as an example data frame 
## col1 name of column for which you want to calculate the nan values 
sum(pd.isnull(df1['col1'])) 
0

在我的代码中使用@sushmit提出的解决方案。

相同的一个可能的变型也可以是

colNullCnt = [] 
for z in range(len(df1.cols)): 
    colNullCnt.append([df1.cols[z], sum(pd.isnull(trainPd[df1.cols[z]]))]) 

优势的是,它返回每个在DF从此列的结果。

1

您可以使用基于value_counts到已给出了答案np.nan

s.value_counts(dropna = False)[np.nan] 
1

的方法和打印价值观和一些改进,这是我的做法

def PercentageMissin(Dataset): 
    """this function will return the percentage of missing values in a dataset """ 
    if isinstance(Dataset,pd.DataFrame): 
     adict={} #a dictionary conatin keys columns names and values percentage of missin value in the columns 
     for col in Dataset.columns: 
      adict[col]=(np.count_nonzero(Dataset[col].isnull())*100)/len(Dataset[col]) 
     return pd.DataFrame(adict,index=['% of missing'],columns=adict.keys()) 
    else: 
     raise TypeError("can only be used with panda dataframe") 
相关问题