0
def conv_name(x):
    try:
        #library to convert strings to name dict
        return pp.tag(str(x))[0]
    except:
        return np.nan

dfn = df.name.to_frame()
dfn['conv'] = dfn.name.apply(lambda x: conv_name(x))
dfn['given_name'] = dfn.conv.apply(pd.Series).GivenName
dfn['sunname'] = dfn.conv.apply(pd.Series).Surname

结果

在此处输入图像描述

  • 我有一个熊猫系列(df.name)的名字。
  • 我想使用外部库(可能的人)解析它们。
  • 该库在某些行上返回异常,因此我已将其放入函数“conv_name”中
  • 我使用 df.apply() 运行该函数以创建一个包含结果的新列
  • 然后,我将结果解析为另外两列,分别表示名字和姓氏

我觉得必须有一种方法可以在不创建 dfn.conv 的情况下创建 firstname 和 surname 列,但是如果我执行类似...

dfn['given_name'] = dfn.name.apply(lambda x: conv_name(x)['GivenName'])

我得到一个 KeyError。

所以我的具体问题是,如何在不创建 conv 列的情况下创建 first 和 surname 列?

4

1 回答 1

1

首先,conv_name通过简单地返回两个值来提高效率:

def conv_name(x):
    try:
        names = pp.tag(str(x))[0]
        return names['GivenName'], names['Surname']
    except:
        return np.nan, np.nan

然后,使用以下命令一次生成两列result_type='expand'

dfn = df.name.to_frame()
names = dfn.name.apply(conv_name, axis=1, result_type='expand')
dfn['given_name'] = names[0]
dfn['surname'] = names[1]

中间结果names将如下所示:

          0          1
0       Bob      Smith
1     Bjorn    Janssen
2  Xiaofeng      Cheng
于 2019-07-06T03:51:16.017 回答