Pandas无法正确地将NaN转换为None



环境

  • Python 3.9.6
  • 数字1.21.0
  • 熊猫1.3.1

我想做什么

None替换数据帧中的所有NaN

我现在拥有的

In[6]: import pandas as pd
In[7]: import numpy as np
In[8]: df = pd.DataFrame({"a":[1,np.nan],"b":[np.nan,"foo"]})
In[9]: df
Out[9]: 
a    b
0  1.0  NaN
1  NaN  foo

In[10]: pd.notnull(df)
Out[10]: 
a      b
0   True  False
1  False   True

In[11]: df.where(pd.notnull(df), None)
Out[11]: 
a     b
0  1.0  None
1  NaN   foo

预期输出

In[11]: df.where(pd.notnull(df), None)
Out[11]: 
a     b
0  1.0  None
1  None  foo

我已经在另一台使用Python 3.8.5和pandas==1.1.1的机器上测试了这一点,它如预期的那样工作。这是个虫子吗?

谢谢!

这不是一个bug。事实上,您在pandas==1.1.1中看到的结果是一个错误,PR39761在以后的版本中已经修复了这个错误。

1.3.0发行说明中也提到了该修复程序。

通常,pandas会尝试强制转换以避免包含objectdtype列的结果,这也不例外。如果你想强制铸造,你可以使用:

>>> df.astype(object).where(pd.notnull(df), None)
a     b
0   1.0  None
1  None   foo

社区中似乎对这个bug修复有一些抱怨,在这里进行了讨论。

最新更新