2013-01-04 93 views
45

MysqlDBを使用して、Pandasデータフレームをmysqlデータベースに書き込もうとしています(またはnumpy配列を使用できます)。 MysqlDBが 'nan'を理解していないように見えて、データベースがフィールドリストにないというエラーをスローします。私は 'nan'をNoneTypeに変換する方法を見つける必要があります。PandasまたはNumpy NanをNoneに置き換えてMysqlDBと一緒に使用する

アイデア?

+0

にはあなたはそれが代わりに '' NULL'ため 'NONE'を返す作るためにパンダに変更できる設定はありませんナノ? –

答えて

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 

注:astypeを使用して、すべてのデータ型の種類を許可するようにデータフレームdtypeを作り直すことができないものを、その後、データフレームfillna方法:

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

残念なことに、これもreplaceを使用してもNoneと動作しません。this (closed) issue。余談として


が、それはほとんどのユースケースのためにあなたなしではNaNを交換する必要がないことは注目に値します、この質問についてthe difference between NaN and None in pandasを参照してください。

しかし、この特定のケースでは、(この回答の時点では)あなたがそう思われます。

+0

クライテリア、それを残念、非常に良い点。おそらく、あなたは代わりに 'NULL'または 'None'を使用することができます... –

+1

は、pandas独自の 'where'を使用して更新されました(不思議なことに、ドキュメントにありません!) –

+0

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

10

あなたがnumpyの配列にNonenanを置き換えることができます。

>>> 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) 
関連する問題