这是一个带有notnull()的Pandas bug还是我的一个根本误解(可能是误解)

时间:2014-05-21 16:50:57

标签: python pandas null

我有一个包含两列和默认索引的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的行总是消失。当出现带有字符串的列时,会出现此问题。

肯定这是一个错误,对吧?我不确定其他人是否能够复制这个。 这是我的Enthought Canopy for Windows(我对UNIX / Linux命令行噪音不够聪明)

以下来自Jeff和unutbu的请求: @ubuntu -

df.dtypes
somestr    object
date       object
dtype:  object

此外:

type(df.iloc[0]['date'])
pandas.tslib.NaTType

在代码中,此列专门指定为pd.NaT 我也不明白NaN何时会说NaN。当我使用这个玩具框架时,我使用的过滤效果很好:

df=pd.DataFrame({'somestr' : ['aa', 'bb'], 'date' : [pd.NaT, dt.datetime(2014,4,15)]}, columns=['somestr', 'date'])

还应该注意,尽管上表中输出中有NaN,但以下输出NaT:

df['date'][0]
NaT

此外:

pd.notnull(df['date'][0])
False

pd.notnull(df['date'][1])
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] [&#39 ;日期']你确实看到了NaT。使用上面的代码片段,您可以看到,在没有somestr列的情况下,非null的过滤是奇怪的。再次 - 这是带有Pandas 0.12和NumPy 1.8的Windows的Enthought Canopy。

1 个答案:

答案 0 :(得分:2)

我也遇到了这个问题。这就是我修复它的方法。 “isnull()”是一个检查某些东西是NaN还是空的函数。 “〜”(代字号)运算符否定以下表达式。所以我们要说的是从原始数据帧给我一个数据帧,但只有“数据”行不为空。

df = df[~df['data'].isnull()]

希望这有帮助!