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 |
#+---------+-----------------+