Фильтрация всех строк с помощью NaT в столбце в python Dataframe

У меня есть df, как это:

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

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

даст мне

    a  b          c
    2 2014-02-01  g

Мне нужна база данных всех строк с NaT в столбце b?

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

Я хочу это:

    a b           c
    1 NaT         w
    3 NaT         x    

Ответы

Ответ 1

isnull и notnull работают с NaT, поэтому вы можете обрабатывать их так же, как вы обрабатываете 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

просто используйте isnull, чтобы выбрать:

df[df.b.isnull()]

   a   b  c
0  1 NaT  w
2  3 NaT  x

Ответ 2

Для тех, кого это интересует, в моем случае я хотел сбросить NaT, содержащиеся в DateTimeIndex в кадре данных. Я не мог напрямую использовать конструкцию notnull, предложенную Karl D. Сначала вам нужно создать временный столбец из индекса, затем применить маску, а затем снова удалить временный столбец.

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

Ответ 3

Используя ваш пример dataframe:

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

До v0.17 это не использовалось для работы:

df.query('b != b') 

и вам нужно было сделать:

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

Так как v0.17, оба метода работают, хотя я бы рекомендовал только первый.