熊猫:运行外部库功能可有效创建新列

时间:2019-07-06 00:45:05

标签: python-3.x pandas parsing processing-efficiency

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

结果

enter image description here

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

我觉得必须有一种不用创建dfn.conv就可以创建名字和姓氏列的方法,但是如果我做类似的事情……

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

我收到一个KeyError。

所以我的具体问题是,如何在不创建conv列的情况下创建第一列和姓氏列?

1 个答案:

答案 0 :(得分: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