Фильтрация всех строк с помощью 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, оба метода работают, хотя я бы рекомендовал только первый.