使用np.NaN时出错是矢量化函数

时间:2017-12-12 01:01:15

标签: pandas numpy vectorization

我在64位Win1o上使用Python 3。我遇到了以下简单功能的问题:

def skudiscounT(t):
    s = t.find("ITEMADJ")
    if s >= 0:
        t = t[s + 8:]
        if t.find("-") == 2:
            return t
    else:
        return np.nan # if change to "" it will work fine!

我尝试在np.Vectorize中使用此功能,并收到以下错误:

Traceback (most recent call last):
 File "C:/Users/lz09/Desktop/P3/SODetails_Clean_V1.py", line 45, in <module>
SO["SKUDiscount"] = np.vectorize(skudiscounT)(SO['Description'])
 File "C:\PD\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 2739, in __call__
 return self._vectorize_call(func=func, args=vargs)
File "C:\PD\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 2818, in _vectorize_call
res = array(outputs, copy=False, subok=True, dtype=otypes[0])
ValueError: could not convert string to float: '23-126-408'

当我将最后一行[return np.nan]替换为[return&#39;&#39;]时,它工作正常。有人知道为什么会这样吗?谢谢!

1 个答案:

答案 0 :(得分:0)

如果没有otypes,则返回数组的dtype由第一个试验结果确定:

In [232]: f = np.vectorize(skudiscounT)
In [234]: f(['abc'])
Out[234]: array([ nan])
In [235]: _.dtype
Out[235]: dtype('float64')

我试图找到一个返回字符串的参数。您的函数看起来也可以返回None

来自文档:

  

vectorized输出的数据类型由调用确定   具有输入的第一个元素的函数。这可以避免   通过指定otypes参数。

使用otypes

In [246]: f = np.vectorize(skudiscounT, otypes=[object])
In [247]: f(['abc', '23-126ITEMADJ408'])
Out[247]: array([nan, None], dtype=object)
In [248]: f = np.vectorize(skudiscounT, otypes=['U10'])
In [249]: f(['abc', '23-126ITEMADJ408'])
Out[249]: 
array(['nan', 'None'],
      dtype='<U4')

但是要返回通用的object dtype,我会稍快一些:

In [250]: g = np.frompyfunc(skudiscounT, 1,1)
In [251]: g(['abc', '23-126ITEMADJ408'])
Out[251]: array([nan, None], dtype=object)

那么你想要什么样的阵列?可以容纳floatnp.nan的{​​{1}}?或string可以举行任何事情&#39;。