[PYTHON] Les masques sont utiles pour rechercher dans les trames de données Pandas

Pandas est utilisé pour traiter diverses données en Python, mais jusqu'à présent, lors de la recherche d'une valeur numérique spécifique, il était normalement traité un par un avec for ou df.iterrows (). Mais lorsque les données grossissent, c'est plus lent.

Après avoir cherché s'il y a un bon moyen, il semble qu'il vaut mieux utiliser df.ix [] comme masque (filtre?).

Par exemple, supposons que vous ayez un bloc de données comme celui-ci:

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   

Je veux connaître la colonne NaN dans la ligne B

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      

Je veux connaître les colonnes qui ne sont pas NaN dans la ligne E

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         

Recherche frappée quelle que soit la ligne NaN

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   

Je ne veux que les trois premières colonnes où la ligne C est NaN

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 

Je veux les lignes A et B d'une colonne qui est NaN dans la ligne D

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

Manipulez le nombre de la ligne A de la colonne NaN de la ligne D (essayez de soustraire 1)

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  

Recherche conditionnelle dans l'état ci-dessus

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   

C'est petit dans cet exemple, mais c'est assez rapide même avec de grandes trames de données.


Postscript Df.apply (function, axis = 1) semble être le meilleur lorsque vous voulez utiliser les valeurs numériques de chaque colonne avec des expressions conditionnelles compliquées.

Recommended Posts

Les masques sont utiles pour rechercher dans les trames de données Pandas
Résumé du livre électronique Python utile pour l'analyse de données gratuite
Meilleures pratiques pour manipuler les données avec les pandas
Principes de base de Pandas pour les débutants ② Présentation des données de saisie