我有一个带有两列和默认索引的 pandas 数据框。第一列是字符串,第二列是日期。最上面的日期是 NaN(尽管实际上应该是 NaT)。
index somestr date
0 ON NaN
1 1C 2014-06-11 00:00:00
2 2C 2014-07-09 00:00:00
3 3C 2014-08-13 00:00:00
4 4C 2014-09-10 00:00:00
5 5C 2014-10-08 00:00:00
6 6C 2014-11-12 00:00:00
7 7C 2014-12-10 00:00:00
8 8C 2015-01-14 00:00:00
9 9C 2015-02-11 00:00:00
10 10C 2015-03-11 00:00:00
11 11C 2015-04-08 00:00:00
12 12C 2015-05-13 00:00:00
将此数据框称为 df。
当我跑步时:
df[pd.notnull(df['date'])]
我希望第一排消失。事实并非如此。
如果我通过设置删除带有字符串的列:
df=df[['date']]
然后申请:
df[pd.notnull(df['date'])]
那么带有 null 的第一行就会消失。
此外,如果所有列都是数字/日期类型,则带有 null 的行始终会消失。当出现带有字符串的列时,就会出现此问题。
这肯定是一个错误,对吧?我不确定其他人是否能够复制这一点。
这是我的 Windows 版 Enthought Canopy 上的内容(我对 UNIX/Linux 命令行噪音不够聪明)
根据 Jeff 和 unutbu 的以下请求:
@ubuntu-
df.dtypes
somestr object
date object
dtype: object
Also:
type(df.iloc[0]['date'])
pandas.tslib.NaTType
在代码中,该列被专门指定为 pd.NaT
我也不明白为什么它应该说 NaT 却说 NaN。当我使用这个玩具框架时,我使用的过滤效果很好:
df=pd.DataFrame({'somestr' : ['aa', 'bb'], 'date' : [pd.NaT, dt.datetime(2014,4,15)]}, columns=['somestr', 'date'])
还应该注意的是,虽然上表的输出中有 NaN,但以下输出 NaT:
df['date'][0]
NaT
Also:
pd.notnull(df['date'][0])
False
pd.notnull(df['date'][1])
True
但是......在评估数组时,它们都返回 True - 奇怪......
np.all(pd.notnull(df['date']))
True
@Jeff - 这是 0.12。我被这个问题困住了。该框架是通过连接使用 psql 从数据库查询中抓取的两个不同框架来创建的。然后通过我所做的计算添加日期和其他一些浮点列。当然,我过滤到了在这里有意义的两个相关列,直到我查明字符串值列导致了问题。
**********如何复制**********
import pandas as pd
import datetime as dt
print(pd.__version__)
# 0.12.0
df = pd.DataFrame({'somestr': ['aa', 'bb'], 'date': ['cc', 'dd']},
columns=['somestr', 'date'])
df['date'].iloc[0] = pd.NaT
df['date'].iloc[1] = pd.to_datetime(dt.datetime(2014, 4, 15))
print(df[pd.notnull(df['date'])])
# somestr date
# 0 aa NaN
# 1 bb 2014-04-15 00:00:00
df2 = df[['date']]
print(df2[pd.notnull(df2['date'])])
# date
# 1 2014-04-15 00:00:00
因此,这个数据框最初包含所有字符串条目 - 然后日期列被转换为顶部带有 NaT 的日期 - 请注意,在表中它是 NaN,但是当使用 df.iloc[0]['date'] 时,你会这样做参见 NaT。使用上面的代码片段,您可以看到无论有没有 somestr 列,按 not null 进行过滤都是奇怪的。再说一次 - 这是适用于 Windows 的 Enthought Canopy,带有 Pandas 0.12 和 NumPy 1.8。