在Dataframe python的列中使用NaT过滤所有行

Jas*_*lam 38 python dataframe pandas

我有这样的df:

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

    df=df[df.b=='2014-02-01']
Run Code Online (Sandbox Code Playgroud)

会给我的

    a  b          c
    2 2014-02-01  g
Run Code Online (Sandbox Code Playgroud)

我想在b列中使用NaT的所有行的数据库?

   df=df[df.b==None] #Doesn't work
Run Code Online (Sandbox Code Playgroud)

我要这个:

    a b           c
    1 NaT         w
    3 NaT         x    
Run Code Online (Sandbox Code Playgroud)

Kar*_* D. 56

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
Run Code Online (Sandbox Code Playgroud)

只是isnull用来选择:

df[df.b.isnull()]

   a   b  c
0  1 NaT  w
2  3 NaT  x
Run Code Online (Sandbox Code Playgroud)


Mic*_*ner 10

我觉得@DSM 的评论本身就值得一个答案,因为这回答了根本问题。

误解来自于pd.NaT行为类似于 的假设None。然而,当None == None返回时Truepd.NaT == pd.NaT返回False。Pandas 的NaT行为就像一个浮点数NaN,它不等于它本身。

正如前面的答案所解释的,您应该使用

df[df.b.isnull()] # or notnull(), respectively
Run Code Online (Sandbox Code Playgroud)


Eel*_*iet 9

对于那些感兴趣的人,在我的情况下,我想删除数据帧的DateTimeIndex中包含的NaT.我无法直接使用Karl D建议的notnull结构.首先必须从索引中创建一个临时列,然后应用掩码,然后再次删除临时列.

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
Run Code Online (Sandbox Code Playgroud)


Rad*_*adu 5

使用示例数据框:

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

直到v0.17,这不起作用:

df.query('b != b') 
Run Code Online (Sandbox Code Playgroud)

你必须这样做:

df.query('b == "NaT"') # yes, surprisingly, this works!
Run Code Online (Sandbox Code Playgroud)

从v0.17开始,两种方法都有效,但我只推荐第一种方法.