J'ai cherché un peu et je n'ai pas pu le trouver, alors j'ai réussi à comprendre comment le sortir, alors prenez une note.
Le thème est "Y a-t-il NaN dans le DataFrame pandas?"
Pour vérifier simplement si les données sont traitées correctement, je voudrais ** savoir s'il existe une valeur NaN dans le bloc de données et où elle se trouve **.
Si vous voulez remplir / supprimer NaN, vous pouvez utiliser fillna ()
/ dropna ()
, mais ce que vous voulez faire maintenant est ** "Vérifiez s'il y a NaN et affichez la ligne (colonne). **
Par exemple, je souhaite extraire uniquement les 2ème-4ème lignes ou 1-3ème colonnes de ce bloc de données.
Création de données
df=pd.DataFrame(np.random.randn(5,5))
df.ix[2:, 1:3] = np.nan
df.columns=list('abcde')
df
#[Out]# a b c d e
#[Out]# 0 -0.678873 -1.277486 -1.062232 0.097525 -2.386115
#[Out]# 1 -1.063709 -1.919997 -0.131733 -0.606348 0.101888
#[Out]# 2 -1.701473 NaN NaN NaN 0.201468
#[Out]# 3 -0.624932 NaN NaN NaN -0.654297
#[Out]# 4 0.345065 NaN NaN NaN -0.232199
Utilisez isnull () / notnull () pour voir s'il y a NaN. Référence ci-dessous
Comment gérer NaN by pandas official: documentation pandas 0.19.1 »Travailler avec des données manquantes
utilisez la méthode isnull
isnull()
df.isnull()
#[Out]# a b c d e
#[Out]# 0 False False False False False
#[Out]# 1 False False False False False
#[Out]# 2 False True True True False
#[Out]# 3 False True True True False
#[Out]# 4 False True True True False
Ce qui est renvoyé est une trame de données de même taille que df et contenant une valeur booléenne. Vrai uniquement chez NaN.
notnull () est l'inverse de True / False de la trame de données retournée par isnull ()
C'est un peu différent de ce que je veux faire
Ce que je veux faire ** "Vérifier s'il y a NaN et afficher la ligne (colonne)" ** Une fois décomposé
Je me demande si ce sera le cas.
** Il y a plus d'un Honyalara ** En parlant de ** méthode ʻany` de numpy **
np.any()
df.isnull().any()
#[Out]# a False
#[Out]# b True
#[Out]# c True
#[Out]# d True
#[Out]# e False
#[Out]# dtype: bool
df.isnull().any(axis=1)
#[Out]# 0 False
#[Out]# 1 False
#[Out]# 2 True
#[Out]# 3 True
#[Out]# 4 True
#[Out]# dtype: bool
df.isnull().any(axis=0) # df.isnull().any()Pareil que
#[Out]# a False
#[Out]# b True
#[Out]# c True
#[Out]# d True
#[Out]# e False
#[Out]# dtype: bool
Puisque la direction de balayage par défaut de «any ()» est la direction de ligne (axe = 0), «df.isnull (). Any ()» est une conversion par «True» (isnull (), c'est-à-dire «NaN») dans la colonne. Renvoie «True» si plus d'un est inclus / «False» sinon. Si vous en définissez un (axe = 1), la direction de balayage est modifiée et la direction de la colonne (axe = 1) est recherchée pour savoir si «True» (c'est-à-dire «NaN») est inclus.
ʻAxis =
peut être omis, donc écrire
df.isnull (). Any (1) ʻest identique àdf.isnull (). Any (axis = 1)
.
C'est un peu différent de ce que je veux faire, et pour le faire ** retourner True
s'il y a NaN
en un seul endroit **, en chevaucher.
Contient-il même un NaN?
df.isnull().any().any() #Contient NaN
#[Out]# True
dff=pd.DataFrame(np.random.randn(5,5)) #Ne contient pas de NaN
dff.isnull().any().any()
#[Out]# False
J'ai fait la même chose pour le débordement de pile. stack overflow - Python pandas: check if any value is NaN in DataFrame Outre df.any (). Any ()
Je l'utilise.
Le temps le plus rapide mesuré par % timeit
était df.isnull (). Values.any ()
.
** Si vous voulez savoir si même un NaN
est inclus **, utilisez-le.
Je peux enfin faire ce que je veux faire.
Avec df.isnull (). Any (1)
, vous pouvez créer une valeur booléenne pour voir si la ligne contient NaN, la découper ** et extraire uniquement les colonnes contenant NaN.
Extraction de ligne avec NaN
df[df.isnull().any(1)]
#[Out]# a b c d e
#[Out]# 2 -1.701473 NaN NaN NaN 0.201468
#[Out]# 3 -0.624932 NaN NaN NaN -0.654297
#[Out]# 4 0.345065 NaN NaN NaN -0.232199
Extraction de lignes avec NaN
df.ix[:,df.isnull().any()]
#[Out]# b c d
#[Out]# 0 -1.277486 -1.062232 0.097525
#[Out]# 1 -1.919997 -0.131733 -0.606348
#[Out]# 2 NaN NaN NaN
#[Out]# 3 NaN NaN NaN
#[Out]# 4 NaN NaN NaN
c'est tout!
Il semble y avoir un moyen plus simple, mais n'est-ce pas? S'il vous plaît, faites-moi savoir.
De plus, alors que l'extraction des seules lignes de pandas a loc
, ʻiloc, l'extraction des colonnes est
df. df.ix [:, <nom de colonne>]
. Il y en a, mais ce n'est pas beau, il y a aussi un beau moyen (ligne loc, iloc et colonne appariée loc, iloc) (\ * ω \ *)
Mise à jour 2017/4/15
Extraire la troisième ligne avec df.icol (3)
Extraire les 0ème et 2ème colonnes avec df.icol ([0,2])
Dans df.icol ([0: 2])
, les 0ème, 1ère et 2ème colonnes ne sont ** pas extraites et d'erreur **
J'ai posté une comparaison de vitesse dans la section des commentaires.
Recommended Posts