2013-01-04 30 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)