Итерация по конкретному столбцу панд Датафрейм / Серия - PullRequest
0 голосов
/ 07 июня 2019

Я выполняю исследовательскую работу, в которой я должен классифицировать кухню на основе ее ингредиентов.Предоставляется набор данных для обучения ингредиентов и тестовый набор данных.Все работает нормально.Модель была обучена с использованием наилучшего подхода в соответствии с точностью среди SGD, RandomForest и Naive Bayes.Я использую Random Forest, потому что его точность лучше, чем у NB и SGD.Тестирование набора данных проверено, и прогноз работает абсолютно нормально.Теперь я хочу предсказать кухню, вручную вводя (используя input() python) ингредиенты.Здесь проблема возникает, когда я пытаюсь искать в серии / Dataframe панд, названных здесь Y = train_data['all_ingredients'] OR Y = train_data['ingredients'].


def check_ing(ing):
    if ing in train_data['all_ingredients'].values:
        return True
    return False


no_of_ingredients = input("Total Number Of Ingredients: ")
no_of_ingredients = int(no_of_ingredients)
ingredient = []
for i in range(no_of_ingredients):
    ing = input("Enter Ingredient " + str(i) + " : ")
    if check_ing(ing) is True:
        ingredient.append(ing)

print(ingredient)

Проблема в операторе if функции check_ing(ing).Как это улучшить для поиска введенного пользователем ингредиента, который, если он действителен или нет.

Результат Y.head() равен: enter image description here

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Не полный ответ, но одна вещь, которую вы могли бы улучшить, это использовать set вместо Series:

valid_ing = set(train_data['Ingredients'])

def check_ing(ing):
    return  ing in valid_ing

Тестовый образец:

d = [''.join(np.random.choice(list('abcdefghijklmn'), 10, replace=True)) for _ in range(1000)]
s = pd.Series(d)

%%timeit
'abc' in s
# 4.3 µs ± 365 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

valid_ing  = set(s)
%%timeit
'abc' in valid_ing 
# 155 ns ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1 голос
/ 07 июня 2019

Я думаю, что это отвечает на ваш вопрос: если входные данные не находятся в ингредиентах столбца, они будут недействительными, возможно, вам придется изменить первую часть, если

РЕДАКТИРОВАТЬ: не проверял,это должно работать.РЕДАКТИРОВАТЬ 2: испортил копирование и вставка.

all_ing = [item for sublist in train_data["Ingredients"] for item in sublist]

def check_ing(ing):
    if ing in all_ing:
            return True
    else:
        print("invalid ingredient")
        return False 

no_of_ingredients = input("Total Number Of Ingredients: ")
no_of_ingredients = int(no_of_ingredients)
ingredient = []

for i in range(no_of_ingredients):
    ing = input("Enter Ingredient " + str(i) + " : ")
    tf = check_ing(ing)
    if tf is True:
        ingredient.append(ing)

print(ingredient)
...