Pandas: 运行 外部库函数有效创建新列
Pandas: Run external library function to create new column efficiently
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
结果
- 我有一个 Pandas 系列 (df.name) 的名字。
- 我想使用外部库 (probablepeople) 解析它们。
- 库 returns 某些行出现异常,因此我已将其放入函数 "conv_name"
- 我 运行 函数使用 df.apply() 创建一个包含结果
的新列
- 然后我将结果解析为名字和姓氏的另外两列
我觉得必须有一种方法可以在不创建 dfn.conv 的情况下创建名字和姓氏列,但是如果我做类似 ...
dfn['given_name'] = dfn.name.apply(lambda x: conv_name(x)['GivenName'])
我收到一个 KeyError。
所以我的具体问题是,如何在不创建 conv 列的情况下创建 first 和 surname 列?
首先,通过简单地返回两个值来提高 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
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
结果
- 我有一个 Pandas 系列 (df.name) 的名字。
- 我想使用外部库 (probablepeople) 解析它们。
- 库 returns 某些行出现异常,因此我已将其放入函数 "conv_name"
- 我 运行 函数使用 df.apply() 创建一个包含结果 的新列
- 然后我将结果解析为名字和姓氏的另外两列
我觉得必须有一种方法可以在不创建 dfn.conv 的情况下创建名字和姓氏列,但是如果我做类似 ...
dfn['given_name'] = dfn.name.apply(lambda x: conv_name(x)['GivenName'])
我收到一个 KeyError。
所以我的具体问题是,如何在不创建 conv 列的情况下创建 first 和 surname 列?
首先,通过简单地返回两个值来提高 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