Примените функцию для изменения нескольких столбцов с помощью логики if else - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь написать функцию с логикой if-else, которая изменит два столбца в моем фрейме данных.Но это не работает.Ниже моя функция

def get_comment_status(df):
    if df['address'] == 'NY':
        df['comment'] = 'call tomorrow'
        df['selection_status'] = 'interview scheduled'
        return df['comment'] 
        return df['selection_status']
    else:
        df['comment'] = 'Dont call'
        df['selection_status'] = 'application rejected'
        return df['comment']
        return df['selection_status']

, а затем выполнить функцию как:

df[['comment', 'selection_status']] = df.apply(get_comment_status, axis = 1)

Но я получаю ошибку.Что я делаю неправильно ?Я думаю, что, вероятно, синтаксис df.apply () неправильный

Сообщение об ошибке:

TypeError: объект 'str' не может быть интерпретирован как целое число KeyError :( 'address','произошло с индексом 0')

пример кадра данных:

df = pd.DataFrame({'address': ['NY', 'CA', 'NJ', 'NY', 'WS', 'OR', 'OR'],
               'name1': ['john', 'mayer', 'dylan', 'bob', 'mary', 'jake', 'rob'],
               'name2': ['mayer', 'dylan', 'mayer', 'bob', 'bob', 'tim', 'ben'],
               'comment': ['n/a', 'n/a', 'n/a', 'n/a', 'n/a', 'n/a', 'n/a'],
               'score': [90, 8, 88, 72, 34, 95, 50],
               'selection_status': ['inprogress', 'inprogress', 'inprogress', 'inprogress', 'inprogress', 'inprogress', 'inprogress']})

Я также думал об использовании лямбда-функции, но она не работает, так как я пытался присвоить значение комментариюСтолбец 'and' selection_status 'с использованием' = '

Примечание: я проверил этот вопрос , который похож по названию, но не решает мою проблему.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы должны использовать numpy.where согласно решению DyZ .Основное преимущество Pandas - векторизованные вычисления.Однако ниже я покажу вам, как вы будете использовать pd.DataFrame.apply.Примечания:

  • Строковые данные подают вашу функцию по одной строке за раз , а не весь фрейм данных за один раз.Следовательно, вы должны называть аргументы соответственно.
  • Два return оператора в функции не будут работать.Функция останавливается, когда достигает return.
  • Вместо этого вам нужно вернуть список результатов, а затем использовать pd.Series.values.tolist для распаковки.

Вот рабочий пример.

def get_comment_status(row):
    if row['address'] == 'NY':
        return ['call tomorrow', 'interview scheduled']
    else:
        return ['Dont call', 'application rejected']

df[['comment', 'selection_status']] = df.apply(get_comment_status, axis=1).values.tolist()

print(df)

  address  name1  name2        comment  score      selection_status
0      NY   john  mayer  call tomorrow     90   interview scheduled
1      CA  mayer  dylan      Dont call      8  application rejected
2      NJ  dylan  mayer      Dont call     88  application rejected
3      NY    bob    bob  call tomorrow     72   interview scheduled
4      WS   mary    bob      Dont call     34  application rejected
5      OR   jake    tim      Dont call     95  application rejected
6      OR    rob    ben      Dont call     50  application rejected
0 голосов
/ 13 июня 2018

То, что вы пытаетесь сделать, не очень соответствует философии Панд.Также apply - очень неэффективная функция.Вы, вероятно, должны использовать Numpy where:

import numpy as np
df['comment'] = np.where(df['address'] == 'NY',
                  'call tomorrow', 'Dont call')
df['selection_status'] = np.where(df['address'] == 'NY',
                           'interview scheduled', 'application rejected')

или логическое индексирование:

df.loc[df['address'] == 'NY', ['comment', 'selection_status']] \
         = 'call tomorrow', 'interview scheduled'
df.loc[df['address'] != 'NY', ['comment', 'selection_status']] \
         = 'Dont call', 'application rejected'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...