无法使用解构赋值分配函数 return 值

Unable to assign function return value with destructuring assignment

我想在一个函数中拆分一个字母和一个数字,return 这两个值并使用解构赋值将它们分配给变量,如下所示:

def split_string(str):
    if str is not np.nan:
        match = re.search("(\w{1})(\d{1,3})", str)
        if match is not None:
            return match.group(0), match.group(1)
    return None, None

函数return得到想要的结果,例如:

0      (None, None)
1           (C, 85)
2      (None, None)
3          (C, 123)

但是,如果我尝试分配结果,我会得到一个 ValueError(data 是来自 CSV 的 Pandas DataFrame,而 data.strings 是一列字符串和 NaN's):

a, b = data.strings.apply(split_string)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-108-40dc67dc859d> in <module>()
      6     return None, None
      7 
----> 8 a, b = data.strings.apply(split_string)

ValueError: too many values to unpack (expected 2)

然而,这工作正常:

def test(x, y):
    return x, y

a, b = test(1, 2)

我在这里错过了什么?我真的很想能够在一行中为整列处理和分配 return 值。谢谢!

应用returns一个系列或数据框。

http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.apply.html

使用 Series 所描述的字符串定义示例数据框。

>>> data = pd.DataFrame({'strings': ['the', 'test', 'data', np.nan, 'end']})

>>> a = data.strings.apply(split_string)
>>> a
0    (None, None)
1    (None, None)
2    (None, None)
3    (None, None)
4    (None, None)

如果您想在一行中创建两个新列,您可以使用 zip

>>> a, b = zip(*data.strings.apply(split_string))
>>> a
(None, None, None, None, None)
>>> b
(None, None, None, None, None)

我们可以将它们作为一行中的新列直接分配给 data

>>> data['a'], data['b'] = zip(*data.strings.apply(split_string))
>>> data
  string     a     b
0    the  None  None
1   test  None  None
2   data  None  None
3    NaN  None  None
4    end  None  None