2016-04-25 21 views
1

Ich brauche mich alle Zeilen mit einem Nullwert in Spalte C. Hier zu befreien ist der Code:Zeilen löschen in Datenrahmen basierend auf Spaltenwerte

infile="C:\****" 

df=pd.read_csv(infile)  

A B C D 
1 1 NaN 3 
2 3 7 NaN 
4 5 NaN 8 
5 NaN 4 9 
NaN 1 2 NaN 

Es gibt zwei grundlegende Methoden, die ich versucht habe.

Methode 1: Quelle: How to drop rows of Pandas DataFrame whose value in certain columns is NaN

df.dropna() 

Das Ergebnis ist ein leerer Datenrahmen, die sinnvoll ist, weil es ein NaN Wert in jeder Zeile ist.

Für diese Methode habe ich versucht, mit dem Subset-Wert mit der Spalte Indexnummer und Spaltenname zu spielen. Der Datenrahmen ist noch leer.

Methode 2: Quelle: Deleting DataFrame row in Pandas based on column value

df = df[df.C.notnull()] 

Ergebnisse immer noch in einem leeren Datenrahmen!

Was mache ich falsch?

+2

'df.dropna (Teilmenge = [ 'C'])' – MaxU

+0

und die zweite Methode gibt keinen leeren Datenrahmen zurück. Könnte es sein, dass dein erster Versuch den Datenrahmen geleert hat? – ayhan

+1

yep, Methode 2 sollte auch funktionieren – MaxU

Antwort

1
df = pd.DataFrame([[1,1,np.nan,3],[2,3,7,np.nan],[4,5,np.nan,8],[5,np.nan,4,9],[np.nan,1,2,np.nan]], columns = ['A','B','C','D']) 
df = df[df['C'].notnull()] 
df 
+0

Verwenden Sie 'notnull' anstelle von Invert' isnull' für die Lesbarkeit – EdChum

+0

@EdChum Er mochte nicht nitnull() oben, so gab ich ihm einige Abwechslung :) – flyingmeatball

+0

Es sieht für mich der OP bekam einen leeren Datenrahmen aufgrund der ersten Inkorrekte Operation – EdChum

0

Es ist nur ein Beweis, dass Ihre method 2 korrekt funktioniert (zumindest mit Pandas 0.18.0):

In [100]: df 
Out[100]: 
    A B C D 
0 1.0 1.0 NaN 3.0 
1 2.0 3.0 7.0 NaN 
2 4.0 5.0 NaN 8.0 
3 5.0 NaN 4.0 9.0 
4 NaN 1.0 2.0 NaN 

In [101]: df.dropna(subset=['C']) 
Out[101]: 
    A B C D 
1 2.0 3.0 7.0 NaN 
3 5.0 NaN 4.0 9.0 
4 NaN 1.0 2.0 NaN 

In [102]: df[df.C.notnull()] 
Out[102]: 
    A B C D 
1 2.0 3.0 7.0 NaN 
3 5.0 NaN 4.0 9.0 
4 NaN 1.0 2.0 NaN 

In [103]: df = df[df.C.notnull()] 

In [104]: df 
Out[104]: 
    A B C D 
1 2.0 3.0 7.0 NaN 
3 5.0 NaN 4.0 9.0 
4 NaN 1.0 2.0 NaN 
+0

Ok, also muss der Unterschied mit meinem Datensatz zu tun haben. Oder ist es möglich, dass meine NaN-Werte nicht wirklich als null erkannt werden? Sie wurden mit pandas.merge generiert. – geolish

+0

@geolish, einfach "df.isnull()" drucken - in den Zellen, die NaN enthalten, sollten Sie "True" -Werte sehen – MaxU

Verwandte Themen