Pandas: запуск функции внешней библиотеки для эффективного создания нового столбца - PullRequest
0 голосов
/ 06 июля 2019
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 Ответ

1 голос
/ 06 июля 2019

Во-первых, сделайте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...