2014-10-08 142 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") 
相關問題