pandas.DataFrame.to_dict
将 nan
转换为 nan
,并将 null
转换为 None
。正如 Python 比较忽略 nan 中所解释的,这有时不是最佳的。
有没有办法将所有
nan
转换为None
? (在 pandas
或稍后在 Python 中)
例如,
>>> df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]})
>>> df
a b
0 1.0 None
1 NaN foo
>>> df.to_dict()
{'a': {0: 1.0, 1: nan}, 'b': {0: None, 1: 'foo'}}
我想要
{'a': {0: 1.0, 1: None}, 'b': {0: None, 1: 'foo'}}
相反。
import pandas as pd
df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]})
df.where((pd.notnull(df)), None)
Out[850]:
a b
0 1 None
1 None foo
df.where((pd.notnull(df)), None).to_dict()
Out[851]: {'a': {0: 1.0, 1: None}, 'b': {0: None, 1: 'foo'}}
初始化为对象 DataFrame(后果自负...):
df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]}, dtype=object)
df
a b
0 1 None
1 None foo
在第一列中,pandas 尝试推断 dtype,并猜测为 float。您可以通过强制其保持
object
从而完全抑制任何类型的转换来防止这种情况。
我发现接受的答案不起作用,但这确实有效:
df.replace([np.nan], [None]).to_dict('records')
我不知道为什么。我至少可以说,df 中似乎有 na 值的所有字段确实通过使用
df.isna()
检查它们来进行了验证。
我从这里得到了解决方案。