2015-12-01 25 views
0

我試圖填充數據框用下面的代碼:numpy的NaN的格式不被認爲是空

df = pd.DataFrame(data=np.random.choice([1, np.nan], size=5)) 


0  1 
1  1 
2 NaN 
3  1 
4  1 

然後:

df[df[0].isnull()] 

2 NaN 

到目前爲止,一切都很好。但是如果我將1修改爲'1',那麼情況會變得很奇怪(imo)。

df = pd.DataFrame(data=np.random.choice(['1', np.nan], size=5)) 

0 1 
1 1 
2 1 
3 1 
4 nan 

問題都與ISNULL

df[df[0].isnull()] 

Empty DataFrame 
Columns: [0] 
Index: [] 

我怎樣才能獲得楠(這是一個字符串)表現得像喃? 我希望能夠快速過濾我的數據框中的所有空值/非空值。

謝謝。

+0

這裏的問題是,'NaN'被轉換成''str' nan'這是令人驚訝AFAIK真正'NaN'需要'float''dtype',在這種情況下,您必須與str'nan'進行比較,這很奇怪IMO – EdChum

+0

謝謝。目前我正在將'str'' nan'轉換回「normal」'NaN'。 – Extratoro

+0

我有點覺得這是一個錯誤,雖然我不會期望'南'當我明確通過'NaN' – EdChum

回答

1

NaN是一個概念,使用數字而不是字符串時有意義。當您使用'1'創建數據框時,熊貓正在推斷該列的類型:str,其中IMO是正確的。因此它會將NaN的值轉換爲它們的字符串表示形式。

需要注意的是如果,例如,你說:

df = pd.DataFrame(data=np.random.choice(['1', 2], size=5)) 

2將被轉換,以及爲字符串。因爲Pandas再一次推斷整列的字符串類型。

但是,你仍然可以輕鬆地與您提出的數據幀進行過濾:

df = pd.DataFrame(data=np.random.choice(['1', np.nan], size=5)) 
df[df[0] == 'nan'] 
+0

我發現自動轉換,但它沒有發生時使用無。 'pd.DataFrame(data = np.random.choice(['1',None],size = 5))'將生成一個帶有一些NoneType值的數據幀。 – Extratoro

+0

實際上,玩這個,'None'正在使用'isnull'方法。 – Extratoro

+0

@Extratoro:有趣。請注意,「無」是不同的類型;一個基本的Python類型,Pandas可能會以不同的方式處理。但是,'NaN'是一個'float'類型;參見'type(numpy.nan)'。所以我猜Pandas會簡單地將任何數字(int或float)轉換爲字符串,當它推斷列的「str」類型(而「NaN」只是一個「float」類型)。 – Peque