2014-10-08 18 views
144

zählen Ich habe Daten, in denen ich die Nummer NaN finden möchte, so dass, wenn es weniger als ein Schwellenwert ist, werde ich diese Spalten fallen lassen. Ich schaute, aber konnte keine Funktion dafür finden. es gibt value_counts, aber es wäre langsam für mich, weil die meisten Werte eindeutig sind und ich nur NaN zählen möchte.Wie die NaN-Werte in einer Spalte in Pandas DataFrame

Antwort

40

Sie konnten die Gesamtlänge von der count von nicht-nan Werte subtrahieren:

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

Sie sollten es auf Ihre Daten Zeit. Für kleine Serie wurde eine 3fache Geschwindigkeit im Vergleich mit der isnull Lösung.

+1

der Tat ist es beste Zeit. Es hängt von der Größe des Rahmens ab, die ich denke, mit einem größeren Rahmen (3000 Reihen), die Verwendung von "isnull" ist schon zwei mal schneller als dies. – joris

+4

Ich versuchte es in beiden Fällen in einer Situation, in der ich die Länge der Gruppe für eine große Gruppe zählte, wo die Gruppengrößen normalerweise <4 waren und joris 'df.isnull(). Sum() mindestens 20x schneller war. Das war mit 0,17,1. –

279

Sie können die Methode isnull() verwenden und dann die Summe der Nan-Werte zählen. Für eine Spalte:

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

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

für mehrere Spalten, es funktioniert auch:

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: Sie sollten dies als Antwort akzeptieren. – hlin117

+0

@ user3799307 ^^^^ – denvar

+0

@ user379937 was sie sagten. Gibt es keinen anderen Weg, sagen Admin kann es akzeptieren? Ich habe es auf den ersten Blick verpasst und habe mit "value_counts" herumgespielt, bevor ich zurückkam. – josh

19

Da Pandas 0.14.1 mein Vorschlag here haben ein Schlüsselwort-Argument in der value_counts Methode umgesetzt wurde:

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

Beste Antwort bis jetzt verwenden, es erlaubt auch andere Werttypen zu zählen. – gaborous

14

wenn Sie Jupyter Notebook verwenden, wie etwa ....

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

oder

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

oder gibt es irgendwo NaNs in den Daten, wenn ja, wo?

df.isnull().any() 
14

Basierend auf den meisten Stimmen Antwort, die wir die fehlenden Werte in der Vorschau anzeigen und die% der fehlenden Werte in jeder Spalte eine Funktion, die uns einen Datenrahmen leicht definieren gibt:

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

, wenn seine Zählung nur Nan Werte in einer Pandas Spalte hier ist ein schneller Weg

0

Verwendet die Lösung von @sushmit in meinem Code vorgeschlagen.

kann eine mögliche Variation des gleichen auch von nun an sein

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

Vorteil davon ist, dass es das Ergebnis für jede der Spalten in der df zurückgibt.

1

Sie können auf die Antwort value_counts Verfahren und Druckwerte von np.nan

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

Basis verwenden, die gegeben wurde und einige Verbesserungen dies ist mein Ansatz

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") 
Verwandte Themen