Python 3.x 熊猫:运行外部库函数以高效地创建新列

Python 3.x 熊猫:运行外部库函数以高效地创建新列,python-3.x,pandas,parsing,processing-efficiency,Python 3.x,Pandas,Parsing,Processing Efficiency,结果 我有一个熊猫系列(df.name)的名字 我想使用外部库(probablepeople)解析它们 库在某些行上返回一个异常,因此我在函数“conv_name”中输入了 我使用df.apply()运行函数来创建一个包含结果的新列 然后,我将结果解析为另外两列的名字和姓氏 我觉得必须有一种方法可以在不创建dfn.conv的情况下创建firstname和姓氏列,但是如果我执行类似于 def conv_name(x): try: #library to convert

结果

  • 我有一个熊猫系列(df.name)的名字
  • 我想使用外部库(probablepeople)解析它们
  • 库在某些行上返回一个异常,因此我在函数“conv_name”中输入了
  • 我使用df.apply()运行函数来创建一个包含结果的新列
  • 然后,我将结果解析为另外两列的名字和姓氏
我觉得必须有一种方法可以在不创建dfn.conv的情况下创建firstname和姓氏列,但是如果我执行类似于

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
我得到一个钥匙错误


因此,我的具体问题是,如何在不创建conv列的情况下创建first和namese列?

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

dfn['given_name'] = dfn.name.apply(lambda x: conv_name(x)['GivenName'])
然后,使用
result\u type='expand'
一次生成两列:

def conv_name(x):
    try:
        names = pp.tag(str(x))[0]
        return names['GivenName'], names['Surname']
    except:
        return np.nan, np.nan
中间结果
names
将如下所示:

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]

仅供参考,
lambda x:conv_name(x)
与简单的
conv_name
相同。
          0          1
0       Bob      Smith
1     Bjorn    Janssen
2  Xiaofeng      Cheng