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
结果
我觉得必须有一种不用创建dfn.conv就可以创建名字和姓氏列的方法,但是如果我做类似的事情……
dfn['given_name'] = dfn.name.apply(lambda x: conv_name(x)['GivenName'])
我收到一个KeyError。
所以我的具体问题是,如何在不创建conv列的情况下创建第一列和姓氏列?
答案 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