2015-10-14 15 views
5

Mam pytanie dla początkujących. Mam ramkę danych I powtarzam i chcę sprawdzić, czy wartość w wierszu kolumna2 jest NaN lub nie, aby wykonać akcję na tej wartości, jeśli nie jest NaN. Moja DataFrame wygląda następująco:Jak iterować wiersze ramki danych i sprawdzić, czy wartość w wierszu kolumny jest NaN

df: 

    Column1 Column2 
0 a  hey 
1 b  NaN 
2 c  up 

Próbuję teraz jest:

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

pupę, że myśl jest taka, że ​​iteracyjne nad wierszy w kolumnie 2 i print ramy dla każdego wiersza, który ma wartość (która jest ciągiem znaków). Co mam jednak jest to:

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' 

Kiedy tylko uruchomić pierwszą linię mojego kodu, otrzymuję

0 
hey 
1 
nan 
2 
up 

co sugeruje, że pływa w wyjściu z pierwszej linii są przyczyną błąd. Czy ktoś może mi powiedzieć, jak mogę osiągnąć to, czego chcę?

Odpowiedz

4

Jak już zrozumieć, frame w

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

jest każdy row w kolumnie jego typem byłby typ elementów w kolumnie (najprawdopodobniej nie byłby to Series lub DataFrame). W związku z tym na to nie działa.

Należy zamiast próbować -

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

Działa to w ten sposób, że drukowane są tylko ramki (wiersze), ale wartości 'nan' są nadal obecne. Ale dlaczego wartości klatek są wyświetlane, gdy powinny być ciągami znaków? –

+0

Pandy reprezentują wszystkie brakujące wartości jako liczba zmiennoprzecinkowa 'nan' –

+1

Możesz użyć' pd.notnull() ', aby sprawdzić, czy wartość nie ma wartości" NaN ". Jeśli chcesz odfiltrować puste wartości ciągów/Brak, możesz także zrobić - 'if frame i pd.notnull (frame):'. –

1

spróbuj tego:

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

Powyższy kod daje dane, dla których Column2 nie wartość null

1

Korzystanie iteritems na serialu (co jest to, co dostajesz, gdy trochę kolumnę z DataFrame) iteracje nad parami (indeksowe, wartość). Tak więc twój item będzie przyjmował wartości 0, 1 i 2 w trzech iteracjach pętli, a twój frame będzie przyjmował wartości 'hey', NaN i 'up' (więc "ramka" jest prawdopodobnie złą nazwą). Błąd pochodzi z próby użycia metody notnull (która jest reprezentowana jako liczba zmiennoprzecinkowa).

Można użyć funkcji pd.notnull Zamiast:

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

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

Innym sposobem byłoby wykorzystanie notnull na całą serię, a następnie iteracyjne nad tymi wartościami (które są teraz logiczna):

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

Dzięki za wyjaśnienie błędu, nie wiedziałem, że nan został przedstawiony jako zmiennoprzecinkowy! –

Powiązane problemy