繁体   English   中英

在数据框python的列中使用NaT过滤所有行

[英]Filtering all rows with NaT in a column in Dataframe 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    

isnullnotnull与工作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

对于那些感兴趣的人,我想删除数据框的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

使用示例数据框:

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开始,尽管我只推荐第一种方法,但这两种方法都有效。

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

误解来自以下假设: pd.NaT行为类似于None 但是,当None == None返回Truepd.NaT == pd.NaT返回False 熊猫NaT行为类似于浮点NaN ,它不等NaT自身。

如前一个答案所述,您应该使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM