MysqlDBを使用してPandasデータフレーム(またはnumpy配列を使用可能)をmysqlデータベースに書き込もうとしています。 MysqlDBは「nan」を理解していないようで、データベースはnanがフィールドリストにないことを示すエラーをスローします。 「nan」をNoneTypeに変換する方法を見つける必要があります。
何か案は?
@bogatronにはそれがあります。 where
を使用できます。これをパンダでネイティブに実行できることに注意してください。
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
注: dtype
を使用してすべてのデータ型を許可するようにDataFrames astype
を再キャストできないのは、DataFrame fillna
メソッドです:
df1 = df.astype(object).replace(np.nan, 'None')
残念ながら、これも replace
を使用しても、None
で動作しません- this(closed)issue 。
余談ですが、ほとんどのユースケースでは、NaNをNoneに置き換える必要がないことに注意してください。 pandas 。
ただし、この特定のケースでは、(少なくともこの回答の時点で)そうするようです。
df = df.replace({pd.np.nan: None})
Github issue で、この男の功績を称えています。
Numpy配列でnan
をNone
に置き換えることができます:
>>> 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'>
つまずいた後、これは私のために働いた:
df = df.astype(object).where(pd.notnull(df),None)
かなり古いですが、私はまったく同じ問題に出くわしました。これを試してください:
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
@Andy Haydenの答えに加えて:
DataFrame.mask
は DataFrame.where
の反対の双子なので、まったく同じ署名を持ちますが、意味は反対です。
DataFrame.where
は、条件がFalseである値を置き換えるのに便利です。DataFrame.mask
はに使用され、条件がTrueである値を置き換えるしたがって、この質問では、df.mask(df.isna(), other=None, inplace=True)
を使用する方がより直感的かもしれません。