2014-05-21 40 views
3

我有一個有兩列和默認索引的熊貓數據框。第一列是一個字符串,第二列是日期。最重要的日期是NaN(儘管它應該是NaT)。這是一個熊貓錯誤與notnull()或我的一個根本的誤解(可能誤解)

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的行總是會消失。當出現帶有字符串的列時,會出現此問題。

肯定這是一個錯誤,對不對?我不確定別人是否能夠複製這個。 這是我Enthought冠的Windows(我不是UNIX/Linux的命令行噪音足夠聰明)

每傑夫下面的請求和unutbu: @ubuntu -

df.dtypes 
somestr object 
date  object 
dtype: object 

另外:

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

在代碼中,此列被專門分配爲pd.NaT 我也不明白爲什麼NaN應該說NaT。當我用這個玩具幀I中所用的過濾工作得很好:

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

還應當注意,儘管上面的表有NaN的輸出,以下輸出納特:

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。使用上面的代碼片斷,您可以看到,通過非null進行篩選與沒有somestr列進行篩選是非常奇怪的。再次 - 這是Pandas 0.12和NumPy 1.8的Windows Enthought Canopy。

+0

爲了幫助我們複製錯誤,請發佈'df.dtypes'。 – unutbu

+0

什麼版本的熊貓?看起來像一個相當古老的錯誤。你是如何創建這個框架的? – Jeff

+0

@Jeff - 我已將信息添加到每個發佈指南的底部的OP。 – FinanceGuyThatCantCode

回答

1

我也遇到過這個問題。這是我如何修復它。 「isnull()」是一個函數,用於檢查某些內容是否爲NaN或空。 「〜」(代字號)運算符會否定以下表達式。所以我們說給你一個來自你的原始數據框的數據框,但只有'數據'行不爲空的地方。

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

希望這有助於!

+0

是的 - 這是當然應該工作的那種。問題更多的是關於應該爲我工作的代碼是我的錯還是熊貓的錯誤​​。我相信我們已經解決了(在上面的評論中)它是Pandas v 0.12中的一個bug,它已經在後續版本中得到修復。 – FinanceGuyThatCantCode

相關問題