Многократные логические условия в векторизованной операции в пандах - PullRequest
0 голосов
/ 08 марта 2019

Я люблю векторизацию, и у меня есть следующие df

df = pd.DataFrame({'p1':['apple','orange'],
                   'p1_dog':['True', 'False'],
                   'p2':['quick','start'],
                   'p2_dog':['True', 'True'],
                   'p3':['ash','sword'],
                   'p3_dog':['False','False']})

Попытка создать новый столбец со значениями, равными p1 или p2 или p3, зависит от значений в p1_dog и p2_dog и p3_dog.

Используя этот код:

df['final'] = 0
df['final'] = [[(p1 if p1_dog == p2_dog == p3_dog == True)\
                     | (p2 if (p1_dog == False) &  (p2_dog == p3_dog == True)\
                        |(p3 if (p1_dog == p2_dog == False) & (p3_dog == True))) for x in df['final']]]  

Хотя это не работает ... Пожалуйста, помогите - где моя ошибка?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Рабочая версия ответа, предоставленного mortysporty ... Еще раз спасибо, товарищ!Просто немного улучшил логическое значение

def evaluate(p1, p2, p3, p1_dog, p2_dog, p3_dog):

if (p1_dog and p2_dog and p3_dog) or (p1_dog and p2_dog) or (p1_dog and p3_dog) or (p1_dog):
    return p1
elif (p2_dog and p3_dog) or (p2_dog):
    # If you are getting here... p1_dog must be False
    return p2
elif p3_dog:
    # ...same here. p1_dog and p2_dog must be False
    return p3
else:
    return "I dont know what you want to happen here"

a = pd.DataFrame({'p1':['apple','orange', 'ball'],
               'p1_dog':[True, False, False],
               'p2':['quick','start', 'heck'],
               'p2_dog':[False, True, True],
               'p3':['ash','sword', 'soop'],
               'p3_dog':[True, False, True]})

a['final'] = [evaluate(*p) for p in zip(a['p1'], a['p2'], a['p3'],
               a['p1_dog'], a['p2_dog'], a['p3_dog'])]
0 голосов
/ 08 марта 2019

Я думаю, что, возможно, я бы попытался разбить условия на отдельные функции.Это становится довольно сложно ..

Может быть, что-то вроде этого ... Я не уверен, точно ли я прибил ваши условия

import pandas as pd

def evaluate(p1, p2, p3, p1_dog, p2_dog, p3_dog):

    if p1_dog and p2_dog and p3_dog:
        return p1
    elif p2_dog and p3_dog:
        # If you are getting here... p1_dog must be False
        return p2
    elif p3_dog:
        # ...same here. p1_dog and p2_dog must be False
        return p3
    else:
        return "I dont know what you want to happen here"

df = pd.DataFrame({'p1':['apple','orange'],
                   'p1_dog':[True, False],
                   'p2':['quick','start'],
                   'p2_dog':[True, True],
                   'p3':['ash','sword'],
                   'p3_dog':[False, False]})

df['final'] = [evaluate(*p) for p in zip(df['p1'], df['p2'], df['p3'],
               df['p1_dog'], df['p2_dog'], df['p3_dog'])]

Если вы не хотите использовать отдельную функцию,проверьте этот пост `elif` в условных списках , чтобы получить подсказку о том, как использовать if-elif-else в списочном понимании.

Также я заметил в вашем определении данных, что вы пишете свои логические значения(True, False) в скобках.Я предполагаю, что это ошибка.Функция, которую я написал, будет работать, только если они не в скобках, то есть не в строках, а в фактических логических значениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...