216

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

何か案は?

4

14 に答える 14

284

@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 を再キャストすることはできません。astypefillna

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

残念ながら、これも使用も、この (クローズされた) 問題replaceNone参照してください。


余談ですが、ほとんどのユースケースでは NaN を None に置き換える必要がないことに注意してください。 pandas の NaN と None の違いに関するこの質問を参照してください。

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

于 2013-01-04T19:01:25.247 に答える
24

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'>
于 2013-01-04T18:57:52.763 に答える
6

@Andy Haydenの回答への追加:

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

  • DataFrame.where条件がFalseの場合の値の置換に役立ちます
  • DataFrame.mask条件がTrueの値を置換するために使用されます

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

于 2019-04-29T04:21:44.520 に答える
2

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

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
于 2016-11-09T14:48:22.423 に答える
0

たまたま確認するコード ブロックはありますか?

.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

于 2021-10-05T19:52:34.913 に答える