2013-01-04 29 views
45

我正在嘗試使用MysqlDB編寫一個熊貓數據框(或可以使用numpy數組)到mysql數據庫。 MysqlDB似乎並不理解'南',我的數據庫拋出一個錯誤,說南不在字段列表中。我需要找到一種方法將'nan'轉換爲NoneType。用無代替熊貓或Numpy Nan與MysqlDB一起使用

任何想法?

+0

有沒有設置,可以在熊貓改變,使其返回'None'爲'NULL'而不是' nan'? –

回答

74

@bogatron有它的權利,你可以使用,這是值得注意的是,你可以在熊貓本身做到這一點:

df1 = df.where((pd.notnull(df)), None) 

注意:這將的所有列的dtype更改爲object

例子:

In [1]: df = pd.DataFrame([1, np.nan]) 

In [2]: df 
Out[2]: 
    0 
0 1 
1 NaN 

In [3]: df1 = df.where((pd.notnull(df)), None) 

In [4]: df1 
Out[4]: 
     0 
0  1 
1 None 

注意:你不能做重鑄DataFrames dtype允許所有數據類型的類型,使用astype,然後將數據幀fillna方法:

df1 = df.astype(object).replace(np.nan, 'None') 

不幸的是,這也不使用replace,與None一起使用,參見this (closed) issue


順便說一句,這是值得注意的是,對於大多數使用情況下,你不需要用無以取代的NaN,看到這個問題有關the difference between NaN and None in pandas

但是,在這個特定的情況下,它似乎你(至少在這個答案的時候)。

+0

cripes,對不起,非常好的一點。也許你可以用'NULL'或'None'代替... –

+1

使用pandas更新自己的'where'(奇怪的是不在文檔中!) –

+0

參見文檔http://pandas.pydata.org/pandas-docs /stable/indexing.html#where-and-masking – Jeff

10

您可以在numpy的陣列替換nanNone

>>> x = np.array([1, np.nan, 3]) 
>>> y = np.where(np.isnan(x), None, x) 
>>> print y 
[1.0 None 3.0] 
>>> print type(y[1]) 
<type 'NoneType'> 
+0

唯一潛在的問題是'dtype'的變化,''x.dtype''是'dtype('float64')',而'y.dtype'是'dtype('object')'。 – Jaime

2

相當古老,但我偶然發現了同樣的問題。 試着這樣做:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x) 
2

周圍絆倒後,這個工作對我來說:

df = df.astype(object).where(pd.notnull(df),None)