Python 2.7 несколько условий для лямбды? Элиф?

Во время следования руководству я обнаружил ошибку: CoreMD с использованием Python

Необходимо создать простой набор данных, следуя инструкциям. Единственная разница между гидом сделана мной:

data["personalityType"] = data["path"].apply(     lambda path: "Enfj" if "enfj" in path
                                             else lambda path: "Enfp" if "enfp" in path
                                             else lambda path: "Entj" if "entj" in path
                                             else lambda path: "Entp" if "entp" in path
                                             else lambda path: "Esfj" if "esfj" in path
                                             else lambda path: "Esfp" if "esfp" in path
                                             else lambda path: "Estj" if "estj" in path
                                             else lambda path: "Estp" if "estp" in path
                                             else lambda path: "Infj" if "Infj" in path
                                             else lambda path: "Infp" if "infp" in path
                                             else lambda path: "Intj" if "intj" in path
                                             else lambda path: "Intp" if "intp" in path
                                             else lambda path: "Isfj" if "isfj" in path
                                             else lambda path: "Isfp" if "isfp" in path
                                             else lambda path: "Istj" if "istj" in path
                                             else "Istp")

вместо:

data["foodType"] = data["path"].apply(lambda path: "Rice" if "rice"

Журнал ошибок в Терминале:

python classifier.py

Traceback (последний вызов был последним): файл "classifier.py", строка 20, в файле data.save("ptype.sframe")

Файл "/usr/local/lib/python2.7/site-packages/turicreate/data_structures/sframe.py", строка 2808, в файле повышения повышения ValueError("Неподдерживаемый формат: {}". Формат (формат))

Файл "/usr/local/lib/python2.7/site-packages/turicreate/cython/context.py", строка 49, в выходном рейсе exc_type (exc_value)

RuntimeError: Исключение при оценке функции обратного вызова Python:

TypeError ("Невозможно преобразовать тип" функция "в гибкий тип.",):

Трассировка (последний вызов был последним): файл "turicreate/cython/cy_pylambda_workers.pyx", строка 427, в файле turicreate.cython.cy_pylambda_workers._eval_lambda "turicreate/cython/cy_pylambda_workers.pyx", строка 172, turkey_workcy_cycy_cycy_py_cycy_workcy.py.jpg.lambda_evaluator.eval_simple
Файл "turicreate / cython / cy_f flex_type.pyx", строка 1306, в файле turicreate.cython.cy_furable_type.process_common_typed_list. Файл "turicreate / cython / cy_f Flexible_type.pyx", строка 1251, в файле turicreate.cython.cy_furable_type._seate_y_yate__index__index__index__setup__y_32_ cy_f flex_type.pyx ", строка 1636, в turicreate.cython.cy_furable_type._ft_translate

Ошибка типа: невозможно преобразовать тип "функция" в гибкий тип.

В чем может быть проблема, потому что я не могу запустить свой classifier.py с Python 2.7

3 ответа

Решение

Замените свой вложенный if / else построить с простой функцией.

Ниже приведен пример:

import pandas as pd, numpy as np

df = pd.DataFrame({'A': ['enfpD', 'iNfp', 'sadintj', 'abc']})

choices = {'enfp', 'entj' , 'entp', 'esfj' , 'esfp',
           'estj', 'estp', 'infj', 'infp', 'intj',
           'intp', 'isfj', 'isfp', 'istj'}

def changer(x):
    match = next((c for c in choices if c in x), None)
    if match:
        return match.title()
    else:
        return 'Istp'

df['A'] = df['A'].apply(changer)

print(df)

#       A
# 0  Enfp
# 1  Istp
# 2  Intj
# 3  Istp

Неверный синтаксис:

     lambda path: "Enfj" if "enfj" in path   
else lambda path: "Enfp" if "enfp" in path
else lambda path: "Entj" if "entj" in path
else lambda path: "Entp" if "entp" in path
else lambda path: "Esfj" if "esfj" in path
else lambda path: "Esfp" if "esfp" in path
else lambda path: "Estj" if "estj" in path
else lambda path: "Estp" if "estp" in path
else lambda path: "Infj" if "Infj" in path
else lambda path: "Infp" if "infp" in path
else lambda path: "Intj" if "intj" in path
else lambda path: "Intp" if "intp" in path
else lambda path: "Isfj" if "isfj" in path
else lambda path: "Isfp" if "isfp" in path
else lambda path: "Istj" if "istj" in path
else "Istp"

Правильный синтаксис:

    lambda path: "Enfj" if "enfj" in path 
else("Enfp" if "enfp" in path
else("Entj" if "entj" in path
else("Entp" if "entp" in path
else("Esfj" if "esfj" in path
else("Esfp" if "esfp" in path
else("Estj" if "estj" in path
else("Estp" if "estp" in path
else("Infj" if "Infj" in path
else("Infp" if "infp" in path
else("Intj" if "intj" in path
else("Intp" if "intp" in path
else("Isfj" if "isfj" in path
else("Isfp" if "isfp" in path
else("Istj" if "istj" in path
else "Istp")))))))))))))))

Проблема здесь в том, что ваша функция возвращает строку, если первая оценка верна, в противном случае она возвращает лямбда-функцию, так как она не вызывает эту функцию. Из-за этого выдается ошибка типа, поскольку столбец SFrame не может содержать различные типы (строку или функцию). Я настоятельно рекомендую определить функцию long if else и передать ее в apply или аналогичную, более эффективную функцию.

Код jpp, модифицированный для простоты и использования Turicreate

import turicreate as tc

sf = tc.SFrame({'path': ['enfpD', 'iNfp', 'sadintj', 'abc']})

choices = ['enfp', 'entj' , 'entp', 'esfj' , 'esfp',
           'estj', 'estp', 'infj', 'infp', 'intj',
           'intp', 'isfj', 'isfp', 'istj']

def changer(x):
    for choice in choices:
        if choice in x:
            return choice.capitalize() 
    return 'Istp'

sf['personalityType'] = sf['path'].apply(changer)

print(sf)

#+---------+-----------------+
#|   path  | personalityType |
#+---------+-----------------+
#|  enfpD  |       Enfp      |
#|   iNfp  |       istp      |
#| sadintj |       Intj      |
#|   abc   |       Istp      |
#+---------+-----------------+
Другие вопросы по тегам