2015-10-14 3 views
5

Ich habe eine Anfängerfrage. Ich habe einen Datenframe, über den ich weitergebe, und ich möchte überprüfen, ob ein Wert in einer column2-Zeile NaN ist oder nicht, um eine Aktion für diesen Wert auszuführen, wenn es nicht NaN ist. Meine Datenrahmen sieht wie folgt aus:Wie man durch Zeilen eines Datenrahmens iteriert und überprüft, ob der Wert in einer Spaltenzeile NaN ist

df: 

    Column1 Column2 
0 a  hey 
1 b  NaN 
2 c  up 

Was ich versuche, ist gerade jetzt:

for item, frame in df['Column2'].iteritems(): 
    if frame.notnull() == True: 
     print 'frame' 

Der Gedanke dahinter ist, dass ich über die Zeilen in Spalte 2 und print Rahmen für jede Zeile durchlaufen, das hat ein Wert (der eine Zeichenfolge ist). Was ich aber bekommen, ist dies:

AttributeError       Traceback (most recent call last) 
<ipython-input-80-8b871a452417> in <module>() 
     1 for item, frame in df['Column2'].iteritems(): 
----> 2  if frame.notnull() == True: 
     3   print 'frame' 

AttributeError: 'float' object has no attribute 'notnull' 

Als ich die erste Zeile meines Codes nur dann laufen, ich

0 
hey 
1 
nan 
2 
up 

erhalten, die die Schwimmer in der Ausgabe der ersten Zeile lässt vermuten, dass die Ursache für der Fehler. Kann mir jemand sagen, wie ich erreichen kann, was ich will?

Antwort

4

Wie Sie bereits wissen, frame in

for item, frame in df['Column2'].iteritems(): 

hat, ist jeder row In der Spalte wäre der Typ der Typ der Elemente in der Spalte (der höchstwahrscheinlich nichtwäre 210 oder DataFrame). Daher würde frame.notnull() darauf nicht funktionieren.

Sie sollten stattdessen versuchen -

for item, frame in df['Column2'].iteritems(): 
    if pd.notnull(frame): 
     print frame 
+0

Es funktioniert in Begriffen, dass nur die Rahmen (Reihen) gedruckt werden, aber die 'nan' Werte sind noch vorhanden. Aber warum schweben die Rahmenwerte, wenn sie Zeichenketten sein sollten? –

+0

Pandas stellt alle fehlenden Werte als Gleitkommazahl 'nan' dar. –

+1

Sie können' pd.notnull() 'verwenden, um zu überprüfen, ob der Wert nicht' NaN' ist. Wenn Sie auch leere Strings/None Werte herausfiltern wollen, können Sie auch - 'if frame und pd.notnull (frame):'. –

1

versuchen Sie dies:

df[df['Column2'].notnull()] 

Der obige Code wird Ihnen die Daten, für die Column2 nicht Nullwert

1

Mit iteritems auf einer Serie (das ist, was Sie bekommen, wenn Sie eine Spalte von einem Datenrahmen nehmen) iteriert über Paare (Index, Wert). Ihre item wird also die Werte 0, 1 und 2 in den drei Iterationen der Schleife nehmen, und Ihre frame wird die Werte 'hey', NaN und 'up' (so "Rahmen" ist wahrscheinlich ein schlechter Name dafür). Der Fehler kommt von dem Versuch, die Methode notnull auf NaN (die als eine Gleitkommazahl dargestellt wird) zu verwenden.

Sie können die Funktion verwenden pd.notnull statt:

In [3]: pd.notnull(np.nan) 
Out[3]: False 

In [4]: pd.notnull('hey') 
Out[4]: True 

Ein anderer Weg wäre notnull auf die gesamte Serie zu verwenden, und dann diese Werte iterieren (die jetzt boolean sind):

for _, value in df['Column2'].notnull().iteritems(): 
    if value: 
     print 'frame' 
+0

Danke für die Erklärung des Fehlers, ich wusste nicht, dass Nan als Fließkomma dargestellt wurde! –

Verwandte Themen