MysqlDB を使用して、Pandas データフレーム (または numpy 配列を使用できます) を mysql データベースに書き込もうとしています。MysqlDB は 'nan' を理解していないようで、私のデータベースは nan がフィールド リストにないというエラーをスローします。「nan」を NoneType に変換する方法を見つける必要があります。
何か案は?
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
注: を使用して、次に DataFrameメソッドdtype
を使用して、すべてのデータ型タイプを許可するように DataFrame を再キャストすることはできません。astype
fillna
df1 = df.astype(object).replace(np.nan, 'None')
残念ながら、これも使用も、この (クローズされた) 問題replace
をNone
参照してください。
余談ですが、ほとんどのユースケースでは NaN を None に置き換える必要がないことに注意してください。 pandas の NaN と None の違いに関するこの質問を参照してください。
ただし、この特定のケースでは、そうしているようです(少なくともこの回答の時点では)。
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'>
@Andy Haydenの回答への追加:
DataFrame.mask
は の反対の双子であるためDataFrame.where
、まったく同じ署名を持ちますが、反対の意味を持ちます。
DataFrame.where
条件がFalseの場合の値の置換に役立ちます。 DataFrame.mask
条件がTrueの値を置換するために使用されます。したがって、この質問では、使用df.mask(df.isna(), other=None, inplace=True)
する方がより直感的かもしれません。
かなり古いですが、まったく同じ問題に遭遇しました。これを試してください:
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
たまたま確認するコード ブロックはありますか?
.locを使用すると、パンダは論理条件 (フィルタリング) に基づいてレコードにアクセスし、それらに対してアクションを実行できます (= を使用する場合)。.locマスクを何らかの値に設定すると、戻り値の配列がインプレースで変更されます (したがって、ここでは少し注意してください。コード ブロックで使用する前に、df コピーでテストすることをお勧めします)。
df.loc[df['SomeColumn'].isna(), 'SomeColumn'] = None
外側の関数はdf.loc[row_label, column_label] = Noneです。.isna()メソッドを使用して、列SomeColumnで「NoneType」値を見つけることにより、row_label にブール値マスクを使用します。
.isna()メソッドを使用して、列SomeColumnの行/レコードのブール配列をrow_labelとして返します: df['SomeColumn'].isna()。SomeColumn にpandasが.isna()メソッドでチェックする「NoneType」項目のいずれかがあるすべての行を分離します。
column_label は、row_label のデータフレームをマスクするときと、.locマスクで処理する列を識別するときに使用します。
最後に、.locマスクをNoneに等しく設定するため、返される行/レコードは、マスクされたインデックスに基づいてNoneに変更されます。
以下は、.locおよび.isna()に関する pandas ドキュメントへのリンクです。
参照:
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.isna.html