用Python在DataFrame中过滤所有包含NaT的列

2024-04-28 03:19:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个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

我想要一个b列有NaT的所有行的数据库?

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

我要这个:

    a b           c
    1 NaT         w
    3 NaT         x    

Tags: none数据库dfnatworkdoesn
3条回答

对于那些感兴趣的人,在我的例子中,我想删除包含在数据帧的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

isnullnotnullNaT一起工作,因此您可以像处理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

使用示例数据帧:

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开始,这两种方法都可以工作。

相关问题 更多 >