web-dev-qa-db-ja.com

MysqlDBで使用するPandasまたはNumpy NanをNoneに置き換える

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

何か案は?

86
Rishi

@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

ただし、この特定のケースでは、(少なくともこの回答の時点で)そうするようです。

143
Andy Hayden
df = df.replace({pd.np.nan: None})

Github issue で、この男の功績を称えています。

34
EliadL

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'>
15
bogatron

つまずいた後、これは私のために働いた:

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

かなり古いですが、私はまったく同じ問題に出くわしました。これを試してください:

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

@Andy Haydenの答えに加えて:

DataFrame.maskDataFrame.where の反対の双子なので、まったく同じ署名を持ちますが、意味は反対です。

  • DataFrame.whereは、条件がFalseである値を置き換えるのに便利です。
  • DataFrame.maskに使用され、条件がTrueである値を置き換える

したがって、この質問では、df.mask(df.isna(), other=None, inplace=True)を使用する方がより直感的かもしれません。

0
YaOzI