在np.where子句之后,在pandas中无法识别NaN.为什么?或者这是一个错误?

kei*_*fly 4 python numpy pandas

在np.where子句之后,在pandas中无法识别NaN.为什么?或者这是一个错误?

这段代码的最后一行应该是"True"

In [1]: import pandas as pd
In [2]: import numpy as np   
In [3]: a=pd.Series([1,np.nan])    
In [4]: b=pd.DataFrame(["a","b"])  
In [5]: b["1"]=np.where(
            a.isnull(),
            np.nan,
            "Hello"
        )   
In [6]: b
Out[6]:
   0      1
0  a  Hello
1  b    nan    
In [7]: b[1].isnull()
Out[7]:
0    False
1    False
Name: 1, dtype: bool
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 8

你可以看看为什么你看看结果where:

>>> np.where(a.isnull(), np.nan, "Hello")
array([u'Hello', u'nan'], 
      dtype='<U32')
Run Code Online (Sandbox Code Playgroud)

因为您的其他值是字符串,所以也where将您转换NaN为字符串并为您提供字符串数组结果.(根据你的平台和/或Python版本,你获得的确切dtype可能会有所不同.)所以你根本没有在你的结果中有NaN,你只需要字符串"nan".

如果你想在pandas中进行这种类型的映射(特别是改变dtypes的映射),通常最好使用pandas构造,.map并避免陷入numpy,因为正如你所看到的,numpy往往会做无用的事情,当它必须解决冲突类型.这是一个如何在熊猫中完成所有操作的示例:

>>> b["X"] = a.isnull().map({True: np.nan, False: "Hello"})
>>> b
   0      X
0  a  Hello
1  b    NaN
>>> b.X.isnull()
0    False
1     True
Name: X, dtype: bool
Run Code Online (Sandbox Code Playgroud)

  • 是否有允许处理此类事情的 Pandas np.where 函数?还是有另一种方法可以重写它以使其有效? (3认同)