web-dev-qa-db-fra.com

Trouver une entrée vide ou NaN dans Pandas Dataframe

J'essaie de chercher dans un Pandas Dataframe pour trouver où il a une entrée manquante ou une entrée NaN.

Voici une base de données avec laquelle je travaille:

cl_id            a           c         d         e        A1              A2             A3
    0            1   -0.419279  0.843832 -0.530827    text76        1.537177      -0.271042
    1            2    0.581566  2.257544  0.440485    dafN_6        0.144228       2.362259
    2            3   -1.259333  1.074986  1.834653    system                       1.100353
    3            4   -1.279785  0.272977  0.197011     Fifty       -0.031721       1.434273
    4            5    0.578348  0.595515  0.553483   channel        0.640708       0.649132
    5            6   -1.549588 -0.198588  0.373476     audio       -0.508501               
    6            7    0.172863  1.874987  1.405923    Twenty             NaN            NaN
    7            8   -0.149630 -0.502117  0.315323  file_max             NaN            NaN

REMARQUE: les entrées vides sont des chaînes vides, car le fichier ne contenait aucun contenu alphanumérique d'origine.

Si j'ai cette base de données, comment puis-je trouver une liste avec les index où l'entrée NaN ou l'entrée vide se produit?

15
edesz

np.where(pd.isnull(df)) renvoie les index de ligne et de colonne dont la valeur est NaN:

In [152]: import numpy as np
In [153]: import pandas as pd
In [154]: np.where(pd.isnull(df))
Out[154]: (array([2, 5, 6, 6, 7, 7]), array([7, 7, 6, 7, 6, 7]))

In [155]: df.iloc[2,7]
Out[155]: nan

In [160]: [df.iloc[i,j] for i,j in Zip(*np.where(pd.isnull(df)))]
Out[160]: [nan, nan, nan, nan, nan, nan]

Il est possible de rechercher des valeurs qui sont des chaînes vides avec applymap:

In [182]: np.where(df.applymap(lambda x: x == ''))
Out[182]: (array([5]), array([7]))

Notez que l'utilisation de applymap nécessite d'appeler une fonction Python une fois pour chaque cellule du DataFrame. Cela pourrait être lent pour un DataFrame volumineux, il serait donc préférable que vous disposiez à la place de NaN dans toutes les cellules vierges pour pouvoir utiliser pd.isnull.

18
unutbu

Essaye ça:

df[df['column_name'] == ''].index

et pour NaN, vous pouvez essayer:

pd.isna(df['column_name'])
4
Vyachez

Solution partielle: pour une colonne de chaîne unique tmp = df['A1'].fillna(''); isEmpty = tmp=='' donne une série booléenne de True où il y a des chaînes vides ou des valeurs NaN.

2
lahoffm