web-dev-qa-db-fra.com

Filtrage de toutes les lignes avec NaT dans une colonne en python Dataframe

J'ai un df comme ça:

    a b           c
    1 NaT         w
    2 2014-02-01  g
    3 NaT         x   

    df=df[df.b=='2014-02-01']

va me donner

    a  b          c
    2 2014-02-01  g

Je veux une base de données de toutes les lignes avec NaT dans la colonne b?

   df=df[df.b==None] #Doesn't work

Je veux ceci:

    a b           c
    1 NaT         w
    3 NaT         x    
26
Jase Villam

isnull et notnull fonctionnent avec NaT afin que vous puissiez les manipuler de la même manière que vous manipulez NaNs:

>>> df

   a          b  c
0  1        NaT  w
1  2 2014-02-01  g
2  3        NaT  x

>>> df.dtypes

a             int64
b    datetime64[ns]
c            object

utilisez simplement isnull pour sélectionner:

df[df.b.isnull()]

   a   b  c
0  1 NaT  w
2  3 NaT  x
42
Karl D.

Pour les personnes intéressées, dans mon cas, je voulais supprimer le NaT contenu dans le DateTimeIndex d'un cadre de données. Je ne pouvais pas utiliser directement la construction notnull proposée par Karl D. Vous devez d'abord créer une colonne temporaire à partir de l'index, puis appliquer le masque, puis supprimer à nouveau la colonne temporaire.

df["TMP"] = df.index.values                # index is a DateTimeIndex
df = df[df.TMP.notnull()]                  # remove all NaT values
df.drop(["TMP"], axis=1, inplace=True)     # delete TMP again
9
Eelco van Vliet

En utilisant votre exemple dataframe:

df = pd.DataFrame({"a":[1,2,3], 
                   "b":[pd.NaT, pd.to_datetime("2014-02-01"), pd.NaT], 
                   "c":["w", "g", "x"]})

Jusqu'à la v0.17, cela ne fonctionnait pas:

df.query('b != b') 

et vous deviez faire:

df.query('b == "NaT"') # yes, surprisingly, this works!

Depuis la v0.17, les deux méthodes fonctionnent, bien que je ne recommande que la première.

5
Radu

Je pense que le commentaire de @DSM mérite une réponse en soi, car cela répond à la question fondamentale.

Le malentendu vient de l'hypothèse selon laquelle pd.NaT agit comme None. Cependant, alors que None == None renvoie True, pd.NaT == pd.NaT renvoie False. Les pandas NaT se comportent comme une NaN à virgule flottante, qui n'est pas égale à elle-même.

Comme l'explique la réponse précédente, vous devriez utiliser 

df[df.b.isnull()] # or notnull(), respectively
0
Michael Dorner