2016-03-25 11 views
2

Ich habe einen Pandas Datenrahmen.Sammle Werte von Pandas Datenframe Spalte A wenn Spalte B ist NaN (Python)

Ich möchte die Werte von Spalte A sammeln/drucken, wo Spalte B NaN ist.

Frage Wie mache ich das?

bearbeiten Weitere: ich habe eine Reihe von Spalten (b, c, d). Ich möchte die Werte der Spalte a auswählen, wenn entweder b, c oder d NaN ist.

(Der Trick NaNs zur Identifizierung ist ein bisschen anders als einfach "==" etc.)

Danke

+0

Mögliches Duplikat [Select Zeilen aus einer Datenrahmen basierend auf Werten in einer Spalte in Pandas] (http://stackoverflow.com/questions/17071871/ select-rows-from-a-datenframe-based-on-values-in-spalte-in-pandas) –

+0

Nicht ganz, aber nah. – denvar

+0

Entschuldigung, ich vergesse, dass 'class NanChecker: __eq__ = staticmethod (math.isnan)' nicht allgemein bekannt ist. dann kannst du ** einfach tun float ('nan') == NanChecker() ' –

Antwort

2

Es sollte ziemlich einfach sein:

In [10]: df 
Out[10]: 
    a b c 
0 NaN 9 7 
1 1.0 7 6 
2 5.0 9 1 
3 7.0 4 0 
4 NaN 2 3 
5 2.0 4 6 
6 6.0 3 6 
7 0.0 2 7 
8 9.0 1 4 
9 2.0 9 3 

In [11]: df.loc[df['a'].isnull(), 'b'] 
Out[11]: 
0 9 
4 2 
Name: b, dtype: int32 

UPDATE:

In [166]: df 
Out[166]: 
    a b c 
0 NaN 5.0 3 
1 7.0 NaN 8 
2 4.0 9.0 7 
3 8.0 NaN 9 
4 3.0 0.0 5 
5 NaN 3.0 5 
6 9.0 0.0 3 
7 0.0 2.0 6 
8 7.0 8.0 7 
9 1.0 7.0 6 


In [163]: df[['a','b']].isnull().any(axis=1) 
Out[163]: 
0  True 
1  True 
2 False 
3  True 
4 False 
5  True 
6 False 
7 False 
8 False 
9 False 
dtype: bool 

In [164]: df.loc[df[['a','b']].isnull().any(axis=1)] 
Out[164]: 
    a b c 
0 NaN 5.0 3 
1 7.0 NaN 8 
3 8.0 NaN 9 
5 NaN 3.0 5 

In [165]: df.loc[df[['a','b']].isnull().any(axis=1), 'c'] 
Out[165]: 
0 3 
1 8 
3 9 
5 5 
Name: c, dtype: int32 
+0

Ich muss dies mit mehreren Spalten behandeln, können Sie einen Blick auf meine Bearbeitung @MaxU – denvar

+1

@denvar, ich habe aktualisiert meine Antwort - bitte überprüfen Sie – MaxU

+0

Das funktioniert einfach wie ein Charme. – denvar

0

Sie können uns auch e np.isnan()

df=  

    a  b 
1 Nan 2 
2 2  3 
3 1  NaN 

for i in range(1,4): 
     if np.isnan(df.loc[i,'a']): 
      print(df.loc[i,'b']) 
out: 2 
0

Vielleicht versuchen, die .fillna() Methode, um Ihre NaNs zu ersetzen. Sie können auch auf eine bestimmte Spalte indizieren, die Sie adressieren möchten, anstatt auf den gesamten Datenrahmen. Hier

ist ein Link auf die Dokumentation: DataFrame.fillna

In [7]: df 
Out[7]: 
      0   1 
0  NaN  NaN 
1 -0.494375 0.570994 
2  NaN  NaN 
3 1.876360 -0.229738 
4  NaN  NaN 

In [8]: df.fillna(0) 
Out[8]: 
      0   1 
0 0.000000 0.000000 
1 -0.494375 0.570994 
2 0.000000 0.000000 
3 1.876360 -0.229738 
4 0.000000 0.000000 
Verwandte Themen