[英]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
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
对于那些感兴趣的人,我想删除数据框的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
返回True
, pd.NaT == pd.NaT
返回False
。 熊猫NaT
行为类似于浮点NaN
,它不等NaT
自身。
如前一个答案所述,您应该使用
df[df.b.isnull()] # or notnull(), respectively
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.