[PYTHON] Masken sind nützlich für die Suche in Pandas-Datenrahmen

Pandas wird beim Umgang mit verschiedenen Daten in Python verwendet, aber bisher wurde es bei der Suche nach einem bestimmten numerischen Wert normalerweise einzeln mit "for" oder "df.iterrows ()" verarbeitet. Wenn die Daten jedoch größer werden, sind sie langsamer.

Nach der Untersuchung, ob es einen guten Weg gibt, scheint es besser zu sein, df.ix [] als Maske (Filter?) Zu verwenden.

Angenommen, Sie haben einen Datenrahmen wie diesen:

print df

                           A        B         C         D         E
TIME                                                                   
2001-01-08 06:00:00  -0.5925    -1.11  0.055023 -0.074103  0.129126    
2001-01-08 06:05:00  -0.4213      NaN       NaN       NaN       NaN
2001-01-08 06:10:00  -0.3613    -2.19       NaN       NaN       NaN    
2001-01-08 06:15:00  -0.3613      NaN       NaN       NaN  0.224574   
2001-01-08 06:20:00  -0.3613      NaN  0.129036 -0.000281  1.094003   
2001-01-08 06:25:00  -0.8243    -0.65  0.137242 -0.022502  2.145931   

Ich möchte die Spalte wissen, die NaN in Zeile B ist

print df.ix[df["B"].isnull()]

                           A        B         C         D         E
TIME                                                                   
2001-01-08 06:05:00  -0.4213      NaN       NaN       NaN       NaN
2001-01-08 06:15:00  -0.3613      NaN       NaN       NaN  0.224574
2001-01-08 06:20:00  -0.3613      NaN  0.129036 -0.000281  1.094003      

Ich möchte die Spalten kennen, die in Zeile E nicht NaN sind

print df.ix[df["E"].isnull()==False]

                           A        B         C         D         E
TIME                                                                   
2001-01-08 06:00:00  -0.5925    -1.11  0.055023 -0.074103  0.129126    
2001-01-08 06:15:00  -0.3613      NaN       NaN       NaN  0.224574
2001-01-08 06:20:00  -0.3613      NaN  0.129036 -0.000281  1.094003
2001-01-08 06:25:00  -0.8243    -0.65  0.137242 -0.022502  2.145931         

Suche getroffen, egal welche Zeile NaN ist

print df.ix[df.isnull().values.any()]

                           A        B         C         D         E
TIME                                                                   
2001-01-08 06:05:00  -0.4213      NaN       NaN       NaN       NaN
2001-01-08 06:10:00  -0.3613    -2.19       NaN       NaN       NaN    
2001-01-08 06:15:00  -0.3613      NaN       NaN       NaN  0.224574   
2001-01-08 06:20:00  -0.3613      NaN  0.129036 -0.000281  1.094003   

Ich möchte nur die ersten drei Spalten, in denen Zeile C NaN ist

print df.ix[df["C"].isnull(), :3]

                           A        B         C         D         E
TIME                                                                   
2001-01-08 06:05:00  -0.4213      NaN       NaN       NaN       NaN
2001-01-08 06:10:00  -0.3613    -2.19       NaN       NaN       NaN 

Ich möchte die Zeilen A und B einer Spalte, die NaN in Zeile D ist

print df.ix[df["D"].isnull(), ["A", "B"]]

                           A        B
TIME                                                                   
2001-01-08 06:05:00  -0.4213      NaN
2001-01-08 06:10:00  -0.3613    -2.19
2001-01-08 06:15:00  -0.3613      Nan

Bearbeiten Sie die Zahl in Zeile A der Spalte, die NaN in Zeile D ist (versuchen Sie, 1 zu subtrahieren).

df.ix[df["D"].isnull(), "A"] -= 1 
print df["A"]

                           A
TIME                          
2001-01-08 06:00:00  -0.5925                 
2001-01-08 06:05:00  -1.4213
2001-01-08 06:10:00  -1.3613
2001-01-08 06:15:00  -1.3613
2001-01-08 06:20:00  -0.3613 
2001-01-08 06:25:00  -0.8243  

Bedingte Suche im obigen Zustand

print df["A"]

                           A
TIME                          
2001-01-08 06:00:00  -0.5925                 
2001-01-08 06:05:00  -1.4213
2001-01-08 06:10:00  -1.3613
2001-01-08 06:15:00  -1.3613
2001-01-08 06:20:00  -0.3613 
2001-01-08 06:25:00  -0.8243  


print df.ix[df["A"]<= -1] 

                           A        B         C         D         E
TIME                      
2001-01-08 06:05:00  -1.4213      NaN       NaN       NaN       NaN
2001-01-08 06:10:00  -1.3613    -2.19       NaN       NaN       NaN    
2001-01-08 06:15:00  -1.3613      NaN       NaN       NaN  0.224574   

In diesem Beispiel ist es klein, aber selbst bei großen Datenrahmen ist es ziemlich schnell.


Nachtrag Df.apply (function, axis = 1) scheint am besten zu sein, wenn Sie die numerischen Werte jeder Spalte mit komplizierten bedingten Ausdrücken bearbeiten möchten.

Recommended Posts

Masken sind nützlich für die Suche in Pandas-Datenrahmen
Python-E-Book-Zusammenfassung nützlich für die frei lesbare Datenanalyse
Best Practices für den Umgang mit Daten mit Pandas
Pandas-Grundlagen für Anfänger ② Übersicht über die Daten