我有一个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] [‘date’]时你做看到NaT.使用上面的代码片段,您可以看到,在没有somestr列的情况下,非null的过滤是奇怪的.再次 – 这是带有Pandas 0.12和NumPy 1.8的Windows的Enthought Canopy.
最佳答案 我也遇到了这个问题.这就是我修复它的方法. “isnull()”是一个检查某些东西是NaN还是空的函数. “〜”(代字号)运算符否定以下表达式.所以我们要说的是从原始数据框中给我一个数据帧,但只有“数据”行是非空的.
df = df[~df['data'].isnull()]
希望这可以帮助!