回答:
@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
データフレームを再キャストして、すべてのデータ型を許可するには、を使用astype
してから、DataFrame fillna
メソッドを使用します。
df1 = df.astype(object).replace(np.nan, 'None')
残念ながら、これもを使用することもreplace
、この(クローズされた)問題をNone
確認することはできません。
余談ですが、ほとんどのユースケースではNaNをNoneに置き換える必要がないことに注意してください。パンダのNaNとNoneの違いについては、この質問を参照してください。。
ただし、この特定のケースでは、あなたがそうしているようです(少なくともこの回答の時点では)。
np.nan
文字列に変換されないようにするためにDjangoで挿入する前に使用すると便利です"nan"
dtype
のobject
、それらのためにそれを行うと、必要に応じて、異なる他の種類を扱います。理想的にfillna(None)
は素晴らしいでしょう。
df = df.replace({np.nan: None})
クレジットは、このGithubの問題でこの人に与えられます。
df.replace({np.nan: None})
一時オブジェクトとして使用できる最良の答えです
@Andy Haydenの回答への追加:
DataFrame.mask
はの反対の双子なので、DataFrame.where
署名はまったく同じですが、意味が逆になります。
DataFrame.where
条件がFalseである値を置き換える場合に役立ちます。 DataFrame.mask
条件がTrueである値を置き換えるために使用されます。したがって、この質問では、使用df.mask(df.isna(), other=None, inplace=True)
する方が直感的かもしれません。
もう1つの追加:複数を置き換え、列の型をオブジェクトから浮動小数点に変換するときは注意してください。がにNone
戻らないことを確実にしたい場合はnp.NaN
、を使用して@ andy-haydenの提案を適用してくださいpd.where
。どのようにして置換が「間違っている」かを示す図:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})
In [4]: df
Out[4]:
a
0 1.0
1 NaN
2 inf
In [5]: df.replace({np.NAN: None})
Out[5]:
a
0 1
1 None
2 inf
In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
a
0 1.0
1 NaN
2 NaN
In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
a
0 1.0
1 NaN
2 NaN
.replace({np.nan: None})
replace({np.nan: None})
。の置き換え時の潜在的な落とし穴を指摘するために、私のコメントが追加されましたnp.nan
。上記は確かに少し私をつまずかせました!
None
のためNULL
の代わりはnan
?